Kotlin/継承


継承

  • の親クラスのpropertyと機能(メンバー関数)を継承します.
  • と同じコードの重複を防止します.
  • kotlinでは、クラスとメソッドのデフォルトはfinalです.したがって、継承を許可するには、クラスの前にopenキーを付ける必要があります.
    (超軽量化を望む方法もプロフェッショナルもそうである)
  • サブクラスをインスタンス化するには、まず親をインスタンス化する必要があります.
  • 親クラスのコンストラクション関数のパラメータは、サブクラスのコンストラクション関数からval/varキーワードをパラメータとして減算する必要があります.
  • open class Car(engine: String, body: String){
    	fun drive(){
        
        	}
            fun stop(){
            
            }
    }
    
    class SuperCar(engine: String, body: String): Car(engine, body){
    	
    }

    📌 に火をつける

  • サブクラスで親クラスのメンバー関数を少し変更して使用する場合は、
  • を使用します.
  • メンバー関数のアクセス制御者を開きます.
  • 上書きキー
  • を使用してメンバー関数を上書きします.
  • ここでsuperは親を指す.
  • open class Car(engine: String, body: String){
    	open fun drive(): String{
        		return "달린다."
        	}
            fun stop(){
            
            }
    }
    
    class SuperCar(engine: String, body: String): Car(){
    	override fun drive(): String{
        		val run = super.drive()
                	return "빨리 $run"
        	}
    }

    練習問題を引き継ぐ


    Charactorクラス:親->攻撃と防御 SuperNight類:Charactorの子類を引き継ぐ SuperMonsterクラス:Charactorのサブクラス+ビットを継承
    // 부모 클래스이므로 open 키워드 사용
    open class Charactor(var hp: Int, val power: Int){
        fun attack(charactor: Charactor, power: Int = this.power){
            charactor.defense(power)
        }
    
        // SuperNight클래스에서 오버라이딩 하기 때문에 open 키워드 사용
        open fun defense(damage: Int){
            hp -= damage
            if(hp > 0) println("${javaClass.simpleName}의 남은 체력 : $hp")
            else println("사망했습니다.")
        }
    }
    
    class SuperNight(hp: Int, power: Int): Charactor(hp, power){
        val defensePower = 2
        
        // 부모 클래스의 defense 오버라이딩
        override fun defense(damage: Int) {
            super.defense(damage - defensePower)
        }
    }
    
    class SuperMonster(hp: Int, power: Int): Charactor(hp, power){
        // SuperMonster의 추가 기능 bite
        fun bite(charactor: Charactor){
            super.attack(charactor, power + 2)
        }
    }
    
    fun main(args: Array<String>){
        val monster = SuperMonster(100, 10)
        val night = SuperNight(200, 8)
    
        monster.attack(night)
        monster.bite(night)
    }

    クラス名の読み込み方法

  • ${javaClass.SimpleName}
  • メッセージにクラス名が必要な場合は
  • を使用します.
  • if(hp > 0) println("${javaClass.simpleName}의 남은 체력 : $hp")