Little Strange Software

スマホアプリの開発を行う LittleStrangeSoftware のブログです。

【実用性皆無!】学習のために無意味にClassを作ってみるテスト その5【誰得?】「ブログ太郎、自分を見つめ直す。の巻」

 どうも!LSSです!

 

 AndroidStudio+Kotlinでスマホアプリ開発の勉強中です。

 

 無意味にClassを作ってみる、バーチャルブログシリーズ「その5」です!

 

その1では、Classを作ってみたら案外簡単に出来た話、

その2では、Classからインスタンスを作る時に引数を省略できる方法の話、

その3では、それまでプロパティしかなかったBloggerクラスにメソッドを作ってみた話。

その4では、読者リストプロパティ等を追加し、読者登録機能を実装した話でした。

 

 今回は、前回追加した読者リストの内容を確認できるものを作ります。

 

 また、その機能を実装する方法として、
もともとあるメソッドであるtoString()を上書き(override) してその機能を割り当てる
という事をやってみます!

 

 

再確認:toString()とは

 これまでも何気なく使用していますが、様々な変数の名前の後ろに.toString()とつけてやると、その変数の中身をString型(文字列型)に変換してくれる、というメソッドです。

 

 例をあげると、

a=8823

textview.text=a

とすると、左辺のtextview.textはString型なので、そこにInt型(整数型)を入れようとしているのでエラーになりますが、

a=8823

textview.text=a.toString()

とすると、aの内容8823が文字列"8823"となり、textviewに8823と出てきてくれる、そんな便利なメソッドです^^

 

 現在、作成しているBloggerクラスは、特にtoString()を用意していませんが、それでもtoString()メソッドは使えちゃいます!

 

なぜ使えちゃうのか、ちょっと小難しい話になりますが…
新規のClassとして作成したBloggerクラスですが、Kotlin内では全てのClassが「Any」というクラスを宣言せずとも継承している事になっているらしく、そのAnyクラスがtoString()メソッドを備えているため、使用できる、という事らしいです。

 

 

試しにブログ太郎をtoString()で文字列化してみます

 複数のプロパティやメソッドを持つBlogger型のインスタンスであるブログ太郎。

 これをtoString()で文字列化したらどうなるのか?

 

tv0.text = "ブロガー名:" + blogtarou.name + "\n" +
"PV累計:" + blogtarou.pv.toString() + "\n" +
blogtarou.hello() +"\n"+
"PV累計:" + blogtarou.pv.toString()+"\n"+
"\n"+
sslkun.hello()+"\n"+
urokogumo.hello()+"\n"+
pokeko.hello()+"\n"+
blogtarou.touroku(sslkun)+"\n"+blogtarou.toString()

 

↑こんな風に赤文字部分を最後に追加しました。

で、実機で実行すると…

 

f:id:little_strange:20200118215737p:plain

 

↑こんなんでました!

jp.~からの部分が該当する部分ですね。

 なんだかプロジェクト名から始まり、クラス名であるBloggerって文字が入ってるのは分かりますが、あとは意味不明の文字列。

 

 便利なはずのtoString()メソッドが、意味不明の文字列を吐くメソッドに成り下がっていますw

 

 

ここから本題。toStringを再利用!

 Blogger.ktに、toStringを上書きするコードを書いていきます!

 

package jp.littlestrangesoftware.a20200111_class_test

class Blogger ( var name:String="ななしのごんべ" , var pv:Int=0){

var follow= mutableListOf<Blogger>()
var follower= mutableListOf<Blogger>()
var notice_text=""

fun hello(): String {
pv++
return "こんにちは!${name}です。よろしく!"
}

fun touroku(aite:Blogger):String{
follow.add(aite)
aite.follower.add(this)
return "${name}${aite.name}の読者になりました!"
}

override fun toString(): String {
var s0=""

s0 = "ブロガー名:$name\n"
s0 += "累計PV:$pv\n"

s0 += "購読中:"
follow.forEach{
s0 += it.name + " "
}
s0 += "\n"

s0 += "読者:"
follower.forEach{
s0 += it.name + " "
}
s0 += "\n"

return s0

}


}

 

 上書き=override、で

override fun toString(): String {

と書き始めています。

 

 overrideで宣言する事で、
「継承元の意味不明な文字列を出す事をやめて、これから書く内容を実行してね!」
っていう宣言ですね。

 

で、取り出す文字列を作るのに、

var s0=""

s0というString型の変数を一時的に使用します。

 

s0 = "ブロガー名:$name\n"
s0 += "累計PV:$pv\n"

 名前やPVを取り出して、¥nで改行を入れながらまず出力。
※なんか\になってますが、¥の半角です^^;

 

follow.forEach{
s0 += it.name + " "
}

 それから、 forEachfollowリストの中のnameを全て、取り出しています。
 これが、そのブロガーが読者登録したブロガー名一覧=購読中一覧です^^

 

follower.forEach{
s0 += it.name + " "
}
 同じく、followernameを全て取り出しています。
 こっちは、そのブロガーを読者登録したブロガーの一覧=読者一覧になります。

 

で、

 return s0

これで、組み立てた文字列を返す事になるはず…。

 

 

確認用のほうも手を加えます!

MainActivity.ktの、tv0を書きだす部分も変更していきます!

package jp.littlestrangesoftware.a20200111_class_test

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

var blogtarou = Blogger("ブログ太郎",1234)

var sslkun = Blogger("SSL君")
var urokogumo = Blogger("うろこ雲")
var pokeko = Blogger("ポケコ")

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

tv0.text = blogtarou.hello() +"\n"+
sslkun.hello()+"\n"+
urokogumo.hello()+"\n"+
pokeko.hello()+"\n"+

blogtarou.touroku(sslkun)+"\n"+
sslkun.touroku(urokogumo)+"\n"+
urokogumo.touroku(pokeko)+"\n"+
pokeko.touroku(blogtarou)+"\n"+

"\n"+blogtarou.toString()+"\n"+
"\n"+sslkun.toString()+"\n" +
"\n"+urokogumo.toString()+"\n" +
"\n"+pokeko.toString()+"\n"
}
}

 

 これまでは、最初にブログ太郎の名前とPVを確認していましたが、最後にtoStringで出力するので省きました!

 

 まず最初に全員がhello()メソッドで挨拶します。

 

 次に、ブログ太郎がSSL君を、SSL君がうろこ雲を、うろこ雲がポケコを、ポケコがブログ太郎を、それぞれ読者登録します。

 

 最後に全員、「状態を確認するメソッド」として生まれ変わったtoString()で、名前・PV・購読ブロガー一覧・読者一覧を確認する、という流れ。

 

 これでまんべんなく、変更点が確認できるはずー!

 

 

さて、実行しますか

f:id:little_strange:20200118230238p:plain

 

 

…だいぶ、画面がカツカツになってきてはいますが、無事に動作しました!!

 

  既存の、それも本来はめっちゃ便利なtoString()メソッドを上書きしてしまう、というのにちょっと恐れもありましたがw、これはBloggerクラスに限っての話なのでセフセフwww

 ※ちなみに、「みんな最初は0」だったハズのPVが1になっているのは、helloメソッドで+1されてるからです^^

 

 

しっかし、それにしても…

  4人いてみんな読者登録してるのに、誰も相互登録していないって、想像すると異常な状況ですよねwwwww

 

 

 

てなとこで、今回はこのへんで!

 次回もまた、よろしくお願いします^^