Kotlin 基礎 Part 5 -- 개방형 클래스와 추상 클래스와 인터페이스 の違い



SOLID の依存性の逆転のために真ん中に依存させる何かが欲しい!
そのために作りたい機能のクラスを作るための 「継承/実装」元の 3 つを比較してみる.
  • 通常のクラスをopenにして関数の本体を書く
  • 抽象クラスに抽象関数のだけを書く
  • Inta-feースに関数のだけを書く

  • 通常のクラスを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ーフェースで書けてしまう.これをエラーにしたい시계に何を使えばいいかは要検証.

    좋은 웹페이지 즐겨찾기