簡體   English   中英

如何指定數據類型以強制執行 inheritance 和接口?

[英]How to specify a data type such that inheritance and interface are enforced?

如何指定(抽象?)數據類型(或 typealias 等) MyType以便強制執行以下條件:

  1. MyTypeandroid.view.View的子類

  2. MyType實現接口MyInterface

用例:我想要一個界面

interface OtherInterface {
    fun foo(context: Context): MyType
}

可以將foo返回的實例添加到FrameLayout (使用ViewGroup::addView(view: View) ),以及調用我在MyInterface中指定的函數。

我想到的foo的具體返回類型的一個例子是

class MyImpl : com.airbnb.lottie.LottieAnimationView, MyInterface

這是一個 class 滿足標准 1.(因為“LottieAnimationView”是View的子類)和 2.,即它可以同時轉換為ViewMyInterface 我不確定如何在foo的聲明中強制執行 1. 和 2. 。

如果存在包含View的所有公共符號的接口IView ,我會這樣做: interface MyType: IView, MyInterface ,但據我所知,這樣的接口並不存在。

因此,您想將MyType定義為具有 View 超類並實現MyInterface嗎? 接口不能從類繼承,因此MyType必須是子類View的 class 。

如果您的具體實現所有子類都可以,但是因為您使用的類是您無法控制的,據我所知( LottieAnimationView ),您不能使它們從您的超類型繼承。

可能可以使用 generics 來解決一些問題(我不確定您是否能夠傳遞 class 類型並調用構造函數將其用作超類型),否則您可能只想創建一個包含 a2F2ED4F8EBC012ABCB4C2 的包裝器 ZA2F2ED4F8EBC012ABCB4C2 View ,你可以把你喜歡的東西放在那里。

類型別名實際上只是標簽。 它們非常適合可讀性並使您的定義更清晰 - 例如具有PhoneNumber類型的phoneNumber屬性,這只是String的別名,或者具有(Int) -> Unit function 類型並命名為ResultListener 但是沒有什么能阻止你將一個普通的舊String傳遞給一個PhoneNumber屬性,因為它們是相同的,它們實際上不是單獨的類型或任何東西。 所以我認為就類型系統而言,你不能用它們做任何聰明的事情!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM