Android Kotlin(5)の『インターフェース』

4467 ワード

Android Kotlin第5編インタフェース.Kotlinシリーズのソースコードはソースコードのダウンロードでダウンロードします.私达はいっしょにKotlinのインタフェースを理解して、私のある地方は书いていないかも知れなくて、みんなが问题を出して、问题を正すことを歓迎します.
1、インタフェースの定義と実現
定義インタフェースKotlinのインタフェースはJava 8と類似しており,抽象的なメソッドの宣言も実装も含まれている.抽象クラスとは異なり、インタフェースはステータスを保存できません.プロパティはありますが、抽象的に宣言するか、アクセサ実装を提供する必要があります.キーワードinterfaceはインタフェースを定義し、デフォルトの実装を許可します.
interface inter1{
        fun A() //   
        fun B() : String{
            return "   "
        }
    }

実装インタフェースクラスまたはオブジェクトは、1つまたは複数のインタフェースを実装することができる.
class test1 : inter1{
        override fun A() {
            //    
        }
        override fun B():String{
            //     ,              
//            return "  B" //  test2().B(),  “  B”
            return super.B() //  test2().B(),  “   ”
        }
    }

2、インタフェースの属性
インタフェースの属性は抽象的なものにすぎず、初期化値は許可されず、インタフェースは属性値を保存しません.インタフェースを実装する場合は、属性を書き換える必要があります.
interface inter2{
        //        ,      
        var stu1 : String
        val stu2 : String
    }

    class test2 : inter2{
        //         
        override var stu1: String = "   stu1"
        override val stu2: String = "   stu2"
    }

3、上書き衝突の解決
複数のインタフェースを実装する場合、同じ方法で複数の実装を継承する問題が発生する可能性があります.
  interface inter3{
        var a:String
        fun foo():String{
            return a
        } //   
        fun A()
        fun B(){}
        fun D() : String{
            return "   "
        }
    }

    interface inter4{
        var a:String
        var stu:String
        fun foo():String{
            stu+="+inter4"
            return "inter4"
        } //   
        fun A()
        fun B()
        fun C():String //          
    }

上のインタフェースinter 3とinter 4の中で、表面の上で4種類の衝突(3つの偽の衝突、1つの真の衝突):-属性aの衝突、属性が抽象的なため、クラスの中で実現するのは唯一で、偽の衝突、残念ながら現在私もどのようにクラスの中で2つのインタフェースの部下性の方法を区別することを見つけていません.クラス内で唯一の実装方法であり、同上属性aタイプ-実装方法Bと未実装方法B、偽の衝突は、クラス内でインスタンスを解決することができる:
class test3 : inter3,inter4{
        override var a : String = "aa"
        override var stu: String=""
        override fun foo() : String{
            return super.foo() //  :aa
        }

        fun foo1() : String{
            return super.foo() //  :inter4
        }

        fun foo2():String{
            stu = super.foo()
            super.foo()
            return stu //  :aa+inter4
        }

        override fun A() {
            //inter3 inter4     A()  ,         ,     A       ,     A    
        }

        override fun B() {
            //      inter4     B
        }
        fun B3() {
            super.B()//        B3    inter3      B()
        }

        override fun C() : String{
            return ""
        }
    }

ネットユーザーからの質問
1、複数のインタフェースに同じ名前の属性がある場合、属性タイプが異なる場合、このときサブクラスはどのように処理されますか.
私はとても喜んで、私たちは一緒にいくつかの問題を検討して解決することができます.現在、私はまだ区別する方法を見つけていませんが、他の2つの方法で問題を回避したり処理したりすることができます.
まず、研究開発の厳格性の角度は私たちができるだけこのような問題を避けなければならない.次にjavaのように、内部クラスを使用して既存の問題を解決することができます.以下のようにします.
    interface inter11{
        var stu1 : Int
    }
    interface inter22{
        var stu1 : String
    }
    //          ,                   
    //        ,                 ,           ?
    //     java  ,               ,     Class11
//    inner class class12 : inter11,inter22 {
//        override var stu1: Int
//        override var stu1: String
//    }
    inner class Class11 : inter11 {
        //         
        override var stu1: Int = 1
        private var stu2 = Class22()//          

        inner private class Class22 : inter22{
            override var stu1: String = ""
            fun foo() : String{
                return [email protected] //            ,this@   
            }
        }
        init {
            stu2.stu1 = "   "
        }
        fun getStu2(): String{//       
            return stu2.stu1
        }
        fun getFoo() : String{//       
            return stu2.foo()
        }
    }
    fun test4() : String{
//        return Class11().getStu2() //  :   
        return Class11().getFoo()//  :   1
    }

もっと良い意見があれば提出してください.コードの同期
これは簡単で、次の編ではKotlinの非常に重要な新しい特性「協程」に注目します.これで私达はKotlinインタフェースの学习を终えて、みんなの観赏と支持に感谢します.
全套のソースコードはここのソースコードをダウンロードして後で発表するKotlinに従って次第に完備します