<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # 委托 參考規范文檔——[委托](http://www.kotlincn.net/docs/reference/delegation.html#%E5%A7%94%E6%89%98) 委托模式也叫代理模式,是最常用的一種設計模式。在委托模式中,如果有兩個對象參與處理同一個請求,則接受請求的對象將請求委托給另一個對象來處理,簡單來說就是A的工作交給B來做。**委托模式是實現繼承的一個很好的替代方式**。在**Kotlin中,委托是通過by關鍵字實現的,并且主要分為兩種形式,一種是類委托,一種是屬性委托**。本節我們將對Kotlin中的委托進行詳細講解。 ## 使用委托代替多繼承 一種Kotlin中新引入的語法——委托。通過它我們也可以代替多繼承來解決類似的問題。 關于委托,可能你會很熟悉。比如你非常了解委托模式,或者你是一名C#開發者,熟悉其中的delegate關鍵字。簡單來說,**委托是一種特殊的類型,用于方法事件委托,比如你調用A類的methodA方法,其實背后是B類的methodA去執行**。 印象中,要實現委托并不是一件非常自然直觀的事情。但慶幸的是,**Kotlin簡化了這種語法,我們只需通過by關鍵字就可以實現委托的效果。比如我們之前提過的by lazy語法,其實就是利用委托實現的延遲初始化語法**。我們再來重新回顧一下它的使用: ``` val laziness: String by lazy { // 用by lazy實現延遲初始化效果 println("I will have a value") "I am a lazy-initialized string" } ``` 委托除了延遲屬性這種內置行為外,還提供了一種可觀察屬性的行為,這與我們平常所說的觀察者模式很類似。觀察者模式在Android開發中應用很廣,我們會利用委托在后面介紹它如何改善Android中的觀察者模式。 接下來,我們來看看如何通過委托來代替多繼承實現需求。請看下面的例子: ``` interface CanFly { fun fly() } interface CanEat { fun eat() } open class Flyer : CanFly { override fun fly() { println("I can fly") } } open class Animal : CanEat { override fun eat() { println("I can eat") } } class Bird(flyer: Flyer, animal: Animal) : CanFly by flyer, CanEat by animal {} fun main(args: Array<String>) { val flyer = Flyer() val animal = Animal() val b = Bird(flyer, animal) b.fly() b.eat() } ``` 有人可能會有疑問:首先,委托方式怎么跟接口實現多繼承如此相似,而且好像也并沒有簡單多少;其次,這種方式好像跟組合也很像,那么它到底有什么優勢呢?主要有以下兩點: * 1)前面說到接口是無狀態的,所以即使它提供了默認方法實現也是很簡單的,不能實現復雜的邏輯,也不推薦在接口中實現復雜的方法邏輯。我們可以利用上面委托的這種方式,雖然它也是接口委托,但它是用一個具體的類去實現方法邏輯,可以擁有更強大的能力。 * 2)假設我們需要繼承的類是A,委托對象是B、C、我們在具體調用的時候并不是像組合一樣A.B.method,而是可以直接調用A.method,這更能表達A擁有該method的能力,更加直觀,雖然背后也是通過委托對象來執行具體的方法邏輯的。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看