欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

解決Kotlin 類在實現(xiàn)多個接口,覆寫多個接口中相同方法沖突的問題

 更新時間:2020年03月16日 12:33:24   作者:向小凱同學學習  
這篇文章主要介紹了解決Kotlin 類在實現(xiàn)多個接口,覆寫多個接口中相同方法沖突的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

一、首先來看一個例子

package net.println.kotlin.chapter4

/**
 * @author:wangdong
 * @description:類實現(xiàn)接口的沖突問題
 */

interface B{
  fun x(): Int = 1
}

interface C{
  fun x(): Int = 0
}

/**一個類實現(xiàn)了兩個接口,兩個接口中的方法相同,這個類在覆寫的時候就會出現(xiàn)沖突*/
class D: B,C{
  //當下面兩個方法同時存在的時候,就會報方法相同的沖突
  override fun x(): Int {
    return super<B>.x()
  }

  override fun x(): Int {
    return super<C>.x()
  }
}

二、解決沖突的例子

package net.println.kotlin.chapter4

/**
 * @author:wangdong
 * @description:類繼承類,實現(xiàn)接口的方法沖突問題
 * 接口方法可以有默認的實現(xiàn)
 * 簽名一致且返回值相同的沖突
 * 子類(實現(xiàn)類)必須覆寫沖突方法
 * super<[父類(接口)名]>.[方法名]([參數(shù)列表])
 */

abstract class A{
  open fun x(): Int = 5
}

interface B{
  fun x(): Int = 1
}

interface C{
  fun x(): Int = 0
}

/**一個類實現(xiàn)了兩個接口,兩個接口中的方法相同,這個類在覆寫的時候就會出現(xiàn)沖突*/
/**采用分支模式解決沖突問題*/
class D(var y: Int = 0):A() ,B,C{

  //返回值一定要一樣啊,例如:一定要是Int
  override fun x(): Int {
    println("call x(): Int in D")
    if (y > 0){
      return y
    }else if (y < -200){
      return super<C>.x()
    }else if (y < -100){
      return super<B>.x()
    }else{
      return super<A>.x()
    }
  }
}

fun main(args: Array<String>) {
  println(D(3).x())
  println(D(-10).x())
  println(D(-110).x())
  println(D(-230).x())
}
/**輸出的結果*/
call x(): Int in D

call x(): Int in D

call x(): Int in D

call x(): Int in D

補充知識:Kotlin 如何優(yōu)雅的實現(xiàn)『多繼承』

這一期給大家講一個有意思的東西。我們都知道 Java 當年高調的調戲 C++ 的時候,除了最愛說的內存自動回收之外,還有一個著名的單繼承,任何 Java 類都是 Object 的子類,任何 Java 類有且只有一個父類,不過,它們可以有多個接口,就像這樣:

public class Java extends Language 
  implements JVMRunnable{  
  ...
}

public class Kotlin extends Language 
  implements JVMRunnable, FERunnable{  
  ...
}

這樣用起來真的比 C++ 要簡單得多,不過有時候也會有些麻煩:Java 和 Kotlin 都可以運行在 JVM 上面,我們用一個接口 JVMRunnable 來標識它們的這一身份;現(xiàn)在我們假設這二者對于 JVMRunnable 接口的實現(xiàn)都是一樣的,所以我們將會在 Java 和 Kotlin 當中寫下兩段重復的代碼:

public class Java extends Language 
  implements JVMRunnable{  
  public void runOnJVM(){    
    ...
  }
}

public class Kotlin extends Language 
  implements JVMRunnable, FERunnable{  
  public void runOnJVM(){    
    ...
  }  
  
  public void runOnFE(){    
    ...
  }
}

重復代碼使我們最不愿意看到的,所以我們決定創(chuàng)建一個 JVMLanguage 作為 Java 和 Kotlin 的父類,它提供默認的 runOnJVM 的實現(xiàn)??瓷先ネΣ诲e。

public abstract class JVMLanguage{  
  public void runOnJVM(){    
    ...
  }
}
    
public class Java extends JVMLanguage{

}

public class Kotlin extends JVMLanguage 
  implements FERunnable{  
  
  public void runOnFE(){    
    ...
  }
}

當然,我們還知道 Kotlin 可以編譯成 Js 運行,那我們硬生生的把 Kotlin 稱作 JVMLanguage 就有些牽強了,而剛剛我們覺得很完美的寫法呢,其實是不合適的。

簡單的說,繼承和實現(xiàn)接口的區(qū)別就是:繼承描述的是這個類『是什么』的問題,而實現(xiàn)的接口則描述的是這個類『能做什么』的問題。

Kotlin 與 Java 在能夠運行在 JVM 這個問題上是一致的,可 Java 卻不能像 Kotlin 那樣去運行在前端,Kotlin 和 Java 運行在 JVM 上這個點只能算作一種能力,而不能對其本質定性。

于是我們在 Java 8 當中看到了接口默認實現(xiàn)的 Feature,于是我們的代碼可以改改了:

public interface JVMRunnable{
  default void runOnJVM(){    
    ...
  }
}
    
public class Java extends Language 
  implements JVMRunnable{

}
  
public class Kotlin extends Language 
  implements JVMRunnable, FERunnable{  
  public void runOnFE(){    
    ...
  }
}

這樣很好,不過,由于接口無法保存狀態(tài),runOnJVM 這個方法的接口級默認實現(xiàn)仍然非常受限制。

那么 Kotlin 給我們帶來什么呢?大家請看下面的代碼:

abstract class Languageinterface JVMRunnable{  
  fun runOnJVM()
}

class DefaultJVMRunnable : JVMRunnable {  
  override fun runOnJVM() {
    println("running on JVM!")
  }
}

class Java(jvmRunnable: JVMRunnable) 
  : Language(), JVMRunnable by jvmRunnable

class Kotlin(jvmRunnable: JVMRunnable) 
  : Language(), JVMRunnable by jvmRunnable, FERunnable{  
  fun runOnFE(){    
    ...
  }
}

通過接口代理的方式,我們把 JVMRunnable 的具體實現(xiàn)代理給了 jvmRunnable 這個實例,這個實例當然是可以保存狀態(tài)的,它一方面可以很好地解決我們前面提到的接口默認實現(xiàn)的問題,另一方面也能在提供能力的同時不影響原有類的『本質』。

以上這篇解決Kotlin 類在實現(xiàn)多個接口,覆寫多個接口中相同方法沖突的問題就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Android手勢識別功能

    Android手勢識別功能

    這篇文章主要為大家詳細介紹了Android手勢識別功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • Android開發(fā)筆記之:消息循環(huán)與Looper的詳解

    Android開發(fā)筆記之:消息循環(huán)與Looper的詳解

    本篇文章是對Android中消息循環(huán)與Looper的應用進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • 淺析Android 快速實現(xiàn)圖片壓縮與上傳功能

    淺析Android 快速實現(xiàn)圖片壓縮與上傳功能

    在Android對手機相冊中的圖片的壓縮和上傳到服務器上,這樣的功能在每個app開發(fā)中都會有這樣的需求.所以今天就對android端怎么快速實現(xiàn)圖片壓縮和上傳進行簡單的分析
    2017-08-08
  • Android中Parcelable的使用詳解

    Android中Parcelable的使用詳解

    Serializable是Java為我們提供的一個標準化的序列化接口。而Parcelable是Android為我們提供的序列化的接口。 這篇文章主要介紹了Android中Parcelable的使用 ,需要的朋友可以參考下
    2019-06-06
  • Android實現(xiàn)可拖拽帶有坐標尺進度條的示例代碼

    Android實現(xiàn)可拖拽帶有坐標尺進度條的示例代碼

    這篇文章主要為大家詳細介紹了如何利用Android實現(xiàn)可拖拽帶有坐標尺進度條的效果,文中的示例代碼講解詳細,需要的小伙伴可以參考一下
    2023-06-06
  • Jetpack?Compose實現(xiàn)點擊事件click的多種方法

    Jetpack?Compose實現(xiàn)點擊事件click的多種方法

    這篇文章主要介紹了Jetpack?Compose實現(xiàn)點擊事件的多種方法,Jetpack?Compose是一款基于Kotlin的聲明式UI工具包,可以方便地創(chuàng)建漂亮的用戶界面,下面我們就來看看Jetpack?Compose添加點擊事件都可以怎么實現(xiàn)
    2024-02-02
  • Android實現(xiàn)手機振動設置的方法

    Android實現(xiàn)手機振動設置的方法

    這篇文章主要介紹了Android實現(xiàn)手機振動設置的方法,涉及Android頁面布局、屬性及功能設置的相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-09-09
  • android自定義彈出框樣式的實現(xiàn)方法

    android自定義彈出框樣式的實現(xiàn)方法

    這篇文章主要為大家詳細介紹了android自定義彈出框樣式的實現(xiàn)方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • Android實現(xiàn)長圖展開與收起效果

    Android實現(xiàn)長圖展開與收起效果

    這篇文章主要為大家詳細介紹了Android實現(xiàn)長圖展開與收起效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • android上一個可追蹤代碼具體到函數(shù)某行的日志類

    android上一個可追蹤代碼具體到函數(shù)某行的日志類

    追蹤代碼到函數(shù)具體某行,這樣的功能,是每一個程序員都希望會有的,因為它可以幫助我們追蹤到某行代碼的錯誤,接下來介紹下android上一個可追蹤代碼到函數(shù)具體某行的日志類,希望對開發(fā)者有所幫助
    2012-12-12

最新評論