うさがにっき

読書感想文とプログラムのこと書いてきます

Kotlinやってみた(クラス関係編)

objectの生成

fun main(args: Array<String>) {
    var bucket = object {
        val capacity: Int = 5
        var quantity: Int = 0
        
        fun fill() {
            quantity = capacity
        }
        
        fun drainAway() {
            quantity = 0
        }
        
        fun printQuantity() {
            println(quantity)
        }
    }
    
    bucket.printQuantity()
}

interface

interface定義

interface Bucket {
    fun fill()
    fun drainAway()
    fun pourTo(that: Bucket)
    
    fun getCapacity(): Int
    fun getQuantity(): Int
    fun setQuantity(quantity: Int)
}

interface実装

fun main(args: Array<String>) {
    fun createBucket(capacity: Int): Bucket = object : Bucket {
        var _quantit: Int = 0
        
        override fun fill() {
            setQuantity(getCapacity())    
        }
    }

    ・・・
}

プロパティ

interfaceにプロパティを持たせることができる

interface Bucket {
    fun fill()
    fun drainAway()
    fun pourTo(that: Bucket)

    // プロパティ
    val capacity: Int
    var quantity: Int
}

interfaceを使ったプロパティの実装

fun main(args: Array<String>) {
    fun createBucket(_capacity: Int): Bucket = object : Bucket {
        // 
        override val capacity = _capacity
        override var quantity: Int = 0
        
        ・・・
    }
}

class

// コンストラクタをclass作成と同時に指定
class BucketImpl(_capacity: Int): Bucket {
    override val capacity = _capacity
    override var quantity: Int = 0
    
    override fun fill() {
        quantity = capacity
    }
    
    ・・・
}

classのインスタンス

newはいらない

fun main(args: Array<String>) {
    val bucketImpl: BucketImpl = BucketImpl(10)
}

メソッド

class Greeter {
    fun greet(name: String) {
        println("Hello $name!")
    }
}

fun main(args: Array<String>) {
    val greeter = Greeter()
    greeter.greet("kotlin")
}

プロパティ

class Person {
    var name: String = ""
    var age: Int = 0
}

fun main(args: Array<String>) {
    val hanako = Person()
    
    println(hanako.name)
    println(hanako.age)
}

コンストラクタ

// パラメータによってコンストラクタ指定
class Rational(val numerator: Int, val denominator: Int) {
    // セカンダリコンストラクタ
    constructor(numerator: Int): this(numerator, 1)
}

イニシャライザ

インスタンス生成の際の処理を定義

class Rational(val numerator: Int, val denominator: Int = 1) {
    init {
        // 初期化時、条件に合わなければ例外スロー
        require(denominator != 0)
    }
}

継承

継承元にはopenをつける、overrideするのにはoverrideってかく
openをつけないとoverrideできない

open class Person(open val name: String) {
    open fun introductMyself() {
        println("I am $name.")
    }
}

class Student(override val name: String, val id: Long) : Person(name){
    override fun introductMyself() {
        println("I am $name(id=$id)")
        // 継承元呼び出し
        super.introductMyself()
    }
}

今の所の感想

オブジェクト指向の基本的な考え方はJavaと同じ感じでだいぶわかりやすい

Kotlinスタートブック

Kotlinスタートブック