[Kotlin] 11. 上書きと抽象化
サブクラスにスーパークラスと同じ名前の関数を持つことはできません.
fun main() {
var t = Tiger()
t.eat()
}
open class Animal {
fun eat() {
println("음식을 먹습니다.")
}
}
class Tiger: Animal() {
fun eat() {
println("고기를 먹습니다.")
}
}
eatスーパークラスAnimalで使用中にエラーが発生しました.ただし,上書きによりサブクラスで再実現できる.
1.誇張
1-1. に火をつける
fun main() {
var t = Tiger()
t.eat()
}
open class Animal{
fun eat() {
println("음식을 먹습니다.")
}
}
class Tiger : Animal()
// 결과
음식을 먹습니다.
例
fun main() {
var t = Tiger()
t.eat()
}
open class Animal{
open fun eat() {
println("음식을 먹습니다.")
}
}
class Tiger : Animal() {
override fun eat() {
println("고기를 먹습니다.")
}
}
// 결과
고기를 먹습니다.
スーパークラスにopenを追加する関数は、サブクラスにoverrideを追加することで再実現できます.オーバーライドは、サブクラスでスーパークラスで完了した関数を再実装します.
次に学習するのは、スーパークラスには関数の具体的な実装はありませんが、スーパークラスの「すべてのサブクラスが関数を実装する必要があります.」抽象(abstraction)を見てみましょう.各サブクラスが必要に応じて空の関数の内容を実現できるように宣言する方法です.
2.抽象化抽象化
2-1. ちゅうしょうかんすう
fun main() {
var r = Rabbit()
r.eat()
r.sniff()
}
abstract class Animal { // 추상클래스는 인스턴스를 만들 수 없다.
abstract fun eat() // 추상함수는 구현하지 않는다.
fun sniff() {
println("킁킁")
}
}
class Rabbit : Animal() {
override fun eat() {
println("당근을 먹습니다.")
}
}
抽象化のもう一つの方法:インタフェースを理解します.2-2. インタフェース
インタフェースの関数
例。
fun main() {
var d = Dog()
d.run()
d.eat()
}
interface Runner {
fun run()
}
interface Eater {
fun eat() {
println("음식을 먹습니다.")
}
}
class Dog : Runner, Eater { // 두 인터페이스를 상속받으려면 표기만 해주면 된다.
override fun run() {
println("우다다다 뜁니다.")
}
override fun eat() {
println("허겁지겁 먹습니다.")
}
}
注意事項。
同じ名前とシェイプを持つ関数を複数のインタフェースまたはクラスで実装する場合は、サブクラスでの混同を回避するために、オーバーライドによって再実装する必要があります.
複数の継承時に同じ名前の関数。
fun main() {
var p = Person()
p.breath()
}
interface Runner {
fun breath() {
println("숨을 하우하후 쉽니다.")
}
}
interface Eater {
fun breath() {
println("숨을 후하후하 쉽니다.")
}
}
class Person : Runner, Eater {
override fun breath() {
super<Eater>.breath()
super<Runner>.breath()
}
}
整理する
Reference
この問題について([Kotlin] 11. 上書きと抽象化), 我々は、より多くの情報をここで見つけました https://velog.io/@ohdowon064/Kotlin-11.-오버라이딩과-추상화テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol