どうも!LSSです!
AndroidStudio+Kotlinでスマホアプリ開発の勉強中です。
無意味にClassを作ってみる、バーチャルブログシリーズ「その5」です!
その1では、Classを作ってみたら案外簡単に出来た話、
その2では、Classからインスタンスを作る時に引数を省略できる方法の話、
その3では、それまでプロパティしかなかったBloggerクラスにメソッドを作ってみた話。
その4では、読者リストプロパティ等を追加し、読者登録機能を実装した話でした。
今回は、前回追加した読者リストの内容を確認できるものを作ります。
また、その機能を実装する方法として、
もともとあるメソッドであるtoString()を上書き(override) してその機能を割り当てる
という事をやってみます!
- 再確認:toString()とは
- 試しにブログ太郎をtoString()で文字列化してみます
- ここから本題。toStringを再利用!
- 確認用のほうも手を加えます!
- さて、実行しますか
- しっかし、それにしても…
再確認: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()
↑こんな風に赤文字部分を最後に追加しました。
で、実機で実行すると…
↑こんなんでました!
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 + " "
}
それから、 forEachでfollowリストの中のnameを全て、取り出しています。
これが、そのブロガーが読者登録したブロガー名一覧=購読中一覧です^^
follower.forEach{
s0 += it.name + " "
}
同じく、followerもnameを全て取り出しています。
こっちは、そのブロガーを読者登録したブロガーの一覧=読者一覧になります。
で、
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・購読ブロガー一覧・読者一覧を確認する、という流れ。
これでまんべんなく、変更点が確認できるはずー!
さて、実行しますか
…だいぶ、画面がカツカツになってきてはいますが、無事に動作しました!!
既存の、それも本来はめっちゃ便利なtoString()メソッドを上書きしてしまう、というのにちょっと恐れもありましたがw、これはBloggerクラスに限っての話なのでセフセフwww
※ちなみに、「みんな最初は0」だったハズのPVが1になっているのは、helloメソッドで+1されてるからです^^
しっかし、それにしても…
4人いてみんな読者登録してるのに、誰も相互登録していないって、想像すると異常な状況ですよねwwwww
てなとこで、今回はこのへんで!
次回もまた、よろしくお願いします^^