Kotlin 基礎 Part 5 -- 개방형 클래스와 추상 클래스와 인터페이스 の違い
왜
SOLID の依存性の逆転のために真ん中に依存させる何かが欲しい!
そのために作りたい機能のクラスを作るための 「継承/実装」元の 3 つを比較してみる.
通常のクラスをopenにして関数の本體を書く
open class Animal {
open fun walk() {
println("てくてく")
}
open fun eat() {
println("もぐもぐ")
}
}
class Human: Animal() {
override fun walk() {
println("二足歩行")
}
}
val kaede = Human()
kaede.walk()
kaede.eat()
二足歩行
もぐもぐ
Kotlin 에서는 오픈을 をつけたクラスは継承できる.
これを使って既に有る메솟드を上書きできる.
今回では Animal クラスを継承した Human クラスを使って
kaede というインスタンスを作成した.
上書きした walk を使うと 二足歩行が使える.
一方、上書きしてない eat も使える.
val fromOpen = Animal()
しかし、오픈 클래스오토바이에서 もinstanceをはやせてしまう.
open class Animal {
fun walk()
}
Function 'walk' without a body must be abstract
さらに、本体はいらないのに、関数の中身を必要とされてしまう.
抽象クラスに抽象関数のだけを書く
abstract class Animal {
abstract fun walk()
open fun eat() {
println("もぐもぐ")
}
}
抽象にすれば、中身を書かなくても定義できる.
これのほうが実装to分離して書ける.
val fromAbs = Animal()
Cannot create an instance of an abstract class
抽象クラスからはinstanceが作れなくなる.
これでopencrasnotoきのように元から作れる問題は解決
class Human: Animal() {
override fun walk() {
TODO("Not yet implemented")
}
}
継承先で override で作るべき関数がない場合は赤線がでて
誘導に従えば TODO 状態で作ってくれる.かなり書きやすい.
abstract class Bisinessman {
abstract fun earnMoney()
}
class Human: Animal(),Bisinessman() {
}
Only one class may appear in a supertype list
また、kaede が Animal の walk, eat だけでなく
Bisinessman の EarMoney も 使いたくなった時
クラスなので複数の継承元を使うことはできなくて困る.
인타페스에 関数のだけを書く
上記の全ての問題はintar-fe-sを使うことで解決する.
interface Animal {
fun walk()
fun eat()
}
interface Businessman {
fun earnMoney()
}
これを使ってクラスを作って中身を作る時は
인타페스の中身を「実装」する.
抽象クラスの中身を「継承」するのではなく.
欠点を強いていえば、何かのクラス内部に作っしまうと
'Animal' is an interface so it cannot be local. Try to use anonymous object or abstract class instead
Inta-fe-s는 밖엔 出せ와 エラーになるくらい.
interface Animal {
fun walk() {
println(
"んぽ"
)
}
fun eat()
}
一方、上書きして実装しないときのデフォルトの挙動もintaーフェースで書けてしまう.これをエラーにしたい시계に何を使えばいいかは要検証.
Reference
이 문제에 관하여(Kotlin 基礎 Part 5 -- 개방형 클래스와 추상 클래스와 인터페이스 の違い), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/kaede_io/kotlin-ji-chu-part-5-abstract-class-to-interface-nowei-i-aok텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)