Kotlin学習日記(四)抽象クラスとインタフェース

2898 ワード

抽象クラス
抽象関数を含みabstractで修飾されたクラスが抽象クラスとなる.
例を挙げます.
abstract class Preson(var name:String,var age:Int){
  abstract var weight
  abstract var gender

  abstract fun doJob()

  open fun eat(){
    pringln("       ")
  }
}

absrtact fun doJob()は抽象メソッドabstract var weight,abstract var genderは抽象プロパティ
抽象クラスに具体的な実装がある関数のデフォルトはfinalであり,書き換えられない.書き換えるにはopenキーを付ける必要があります.抽象メソッドのデフォルトはopen修飾です
具体的なクラスの実装を見てみましょう
abstract class Student(var name:String, var age:Int): Person(name, age){
  override var weight = "50kg"
  override var gender = "     "

  override fun doJob(){
    println("         ")
  }

  override fun eat(){
     super.eat()
     println("           ")
  }
}

もちろん抽象クラスはprivateできないし、布団クラスは継承できないし、毛糸抽象もできない.使い方はJavaと似ている.
インタフェース
インタフェースはinterfaceをキーワードとし,基本的にJavaのインタフェースと似ているがkotlinのインタフェースには抽象的な方法も実現した方法もある.
例:
interface Animal{
  val kind
  val color

  fun doing()

  fun eat(){
    println("      ")
  }
}
class Dog:Animal{
  override val kind = "   "
  override val color = “   ”
  overrice fun doing(){
    println("    ")
  }
}

Kotlinのクラスではクラスは1つしか継承できませんが、複数のインタフェースを継承できるため、競合を上書きする問題がある可能性があります.
私が宣言したDogクラスというDogが変異しても人間の特性があると仮定してPresonを継承させますがeat()メソッドを呼び出すと問題が発生しますsuper.eat()呼び出しは誰ですか?これは、次のように呼び出すことができます.
super.eat()
super.eat()

このようにこの変異Dogも犬の食糧を食べることができて、食堂も食べることができて、泥棒はすごいO(∩∩)Oはははは~
実は抽象クラスとインタフェースは本質的に違いがあり、似ていますが.
以下に違いを示します.
概念上の区別
インタフェースは主に動作の抽象であり,動作特性の規則を定義している.抽象クラスは根源に対する抽象である.物事の本質に注目するときは抽象的なクラスを使います.操作に注目するときは、インタフェースを使用します.
文法的な違い
インタフェースはステータスを保存できません.プロパティはありますが、抽象的でなければなりません.1つのクラスは1つの抽象クラスしか継承できませんが、1つのクラスは複数のインタフェースを実現できます.
クラスがインタフェースを実装する場合は、インタフェース宣言のすべてのメソッドを実装する必要があります.しかし、クラスは抽象クラス宣言のすべての方法を実現しなくてもよい.もちろん、この場合、クラスも抽象的に宣言しなければならない.
インタフェース内のすべての方法は抽象的である.抽象クラスには抽象と非抽象の両方のメソッドが含まれます.
設計上の区別
抽象クラスは一つの事物に対する抽象であり、すなわちクラスに対して抽象であり、インタフェースは行為に対する抽象である.抽象クラスは、属性、動作を含むクラス全体を抽象化しますが、インタフェースはクラスのローカル(動作)を抽象化します.
継承はis aの関係であり、インタフェース実装はhas aの関係である.クラスが抽象クラスを継承している場合、サブクラスは必ず抽象クラスの種類であり、インタフェース実装にはこのタイプの関係は必要ありません.
設計面が異なり、抽象クラスは多くのサブクラスの親としてテンプレート式の設計である.インタフェースは放射式設計である挙動規範である.つまり、
  • 抽象クラスについて、新しい方法を追加する必要がある場合は、抽象クラスに具体的な実装を直接追加することができ、サブクラスは変更しなくてもよい.
  • でインタフェースに対してはだめであり、インタフェースが変更された場合、このインタフェースを実現するすべてのクラスは相応の変更を行わなければならない.                                 

  • 実際の応用上の差異
    実際の使用では、抽象クラス(すなわち継承)を使用し、A is a Bの関係を記述するための強い結合設計である.すなわち、AがBに継承されているとすれば、コードでAをBとして使用するのは全く問題ないはずである.例えばAndroidでは,各種コントロールをViewとして扱うことができる.
    2つのタイプの関係がis aではなくis like aである場合は、継承を慎重に考慮する必要があります.継承を使用すると、子と親の結合依存関係をうまく処理することに注意しなければならないからです.組み合わせは継承より優れている.