テキストに載っていたコードに自分なりの解釈を言葉にして付け加えてみた。
最初のcreateBucketの定義のところがちょっとしっくりきていない。
ここは戻り値がBucketなのか。
でもインターフェースBucketが戻り値ってよく意味わからないから、やっぱりBucketを実装しているってことか。
試しにcreateBucketの:Bucketを無くして実行しても同様の答えが得られ、objectの方の:Bucketを省略するとコンパイルエラーになった。
objectとは小さいクラスみたいなものらしくて、だからインターフェースの実装とかインスタンス化で使えるようになるとか、クラスと同じような特徴があるのか。
ただどういう時にクラスとオブジェクトを使い分けるのかが、いまいちまだわからないからまた勉強して、アップしていこう。
今回学んで良かったことは、thatのニュアンスを理解できたこと。
僕なりのしっくりきた解釈
thatとは、、、
「同じ種類のやつやけど、あっちのやつやで」
て感じかな。
下記のサンプルコードで言うと、
fun pourTo(that: Bucket)の「that」はBucketインターフェースを実装するobjectだけど、呼び出しに使ってるやつじゃなくて、別のあっちのオブジェクトってこと。
つまり、同じインターフェースを実装した別のオブジェクトを引数に渡してね!てことでどうでしょうか。
うん。これからもがんばろう!
建設業界の未来のために。
以下、勉強に使ったコードです。
interface Bucket{
fun fill()
fun drainAway()
fun pourTo(that: Bucket)
fun getCapacity(): Int
fun getQuantity(): Int
fun setQuantity(quantity: Int)
}
fun createBucket(capacity: Int): Bucket = object: Bucket{
//(capacity)を引数にした、インターフェースBucketを実装した関数createBucket?は、
//インターフェースBucketを実装したobjectである
var _quantity = 0
override fun fill() {
setQuantity(getCapacity())
//getCapacity()で得た値を引数にセット
}
override fun drainAway() {
setQuantity(0)
//0をセットする = バケツの中身の水をなくす
}
override fun pourTo(that: Bucket) {//
val thatVacuity = that.getCapacity() - that.getQuantity()
//thatはバケツオブジェクトを実装するもうひとつのバケツオブジェクト
//上記の式はもう一つのキャパシティから今入ってる水の量を引いている
//つまり、もう一つのバケツにはあとどれくらいの水が入るか(余力があるか)を計算している
if(getQuantity() <= thatVacuity){
//元のバケツに入っている水の量より余力の方が大きいならば、、、
//元のバケツの水が全て、もう一つのバケツに入り切るならば、
that.setQuantity(that.getQuantity() + getQuantity())
//もう一つのバケツに元のバケツの量を足して、もう一つのバケツにセット
//つまり、もう一つのバケツに元のバケツに入っている水を足してということ
drainAway()
//元のバケツの水は「0」←もう一つのバケツに全部入ったから
}else{
//それ以外なら、、
//つまり、元のバケツの水がもう一つに入りきらないならば、
that.fill()
//もう一つのバケツはいっぱいになり、
setQuantity(getQuantity() - thatVacuity)
//元のバケツからもう一つのバケツへ入れて残った分の水が、元のバケツに残る
}
}
override fun getCapacity(): Int = capacity
//バケツのキャパ(容量)をセット
override fun getQuantity(): Int = _quantity
//今入っている水の量をゲット(初期値は0)
override fun setQuantity(quantity: Int) {
_quantity = quantity
//バケツに水をいれる
}
}
fun main(args: Array<String>){
val bucket1 = createBucket(7)
//キャパ7のバケツ1を生成
val bucket2 = createBucket(4)
//キャパ4のバケツ2を生成
bucket1.fill()
//バケツ1を満タンにする。
bucket1.pourTo(bucket2)
//バケツ1(キャパ7:満タン)の水をバケツ2(キャパ4:中身0)にいれる
println("bucket1: " + bucket1.getQuantity())
//結果 bucket1: 3
println("bucket2: " +bucket2.getQuantity())
//結果 bucket2: 4
}