【问题标题】:How to specify a data type such that inheritance and interface are enforced?如何指定数据类型以强制执行继承和接口?
【发布时间】:2021-04-19 15:41:29
【问题描述】:

如何指定(抽象?)数据类型(或类型别名等)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

这是一个满足标准 1.(因为“LottieAnimationView”是 View 的子类)和 2. 的类,即它可以同时转换为 ViewMyInterface。我不确定如何在foo 的声明中强制执行 1. 和 2.。

如果存在包含View 的所有公共符号的接口IView,我会这样做:interface MyType : IView, MyInterface,但据我所知,这样的接口不存在。

【问题讨论】:

  • 欢迎来到 Stack Overflow!你说你的标准是让MyType 是一个接口,但还是一个子类?这是不可能的,你不能有一个从具体类继承的接口。
  • 我已经不太精通Android了,尤其是在子类化View方面,但是class MyType(...) : View(...), MyInterface { ... }有问题吗?
  • 我正要准确评论@Joffery。这个问题似乎描述了实现......
  • 我不认为你可以,因为这符合你的标准abstract class MyType(...) : View(...), MyInterface,但这会让你想要通过的任何视图都是MyType的实现,这意味着重新创建每次都能看到全貌。例如 TextView 你不能,你必须实现 MyType 复制/粘贴整个 TextView 代码。除非,如果 MyType 是一个视图组并且包含在 View 内?
  • @Joffrey 抱歉,我想我没有完全描述我的问题。我已经更新了这个问题,希望现在更清楚了。

标签: android kotlin


【解决方案1】:

所以您想将MyType 定义为拥有一个View 超类并实现MyInterface?接口不能从类继承,所以MyType 必须是View 的子类。

如果您的具体实现都是子类,您会很好,但是因为您使用的类是您无法控制的,据我所知 (LottieAnimationView),您不能让它们从您的超类型继承。

可能可以使用泛型解决问题(我不确定您是否能够传递类类型并调用构造函数将其用作超类型),否则您可能只想创建一个包含View 的包装类,然后您可以在其中放置您喜欢的内容。

类型别名实际上只是标签。它们非常适合可读性并使您的定义更清晰 - 例如具有 PhoneNumber 类型的 phoneNumber 属性,其中这只是 String 的别名,或者具有 (Int) -> Unit 函数类型并命名为 ResultListener .但是没有什么能阻止你将一个普通的旧 String 传递给一个 PhoneNumber 属性,因为它们是相同的,它们实际上不是单独的类型或任何东西。所以就类型系统而言,我不认为你可以用它们做任何聪明的事情!

【讨论】:

    猜你喜欢
    • 2022-01-04
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多