我有这样的界面。

interface MenuOption {
    val name: String
}

实现上述内容的另一个数据类。
data class XYZMenuOption (override val name: String) : MenuOption

我有这样的家长类。
class MenuWidget {
    fun listener (options: MenuOption) {}
}

第二个类继承了它。此类覆盖了侦听器功能,但应将已实现的数据类作为参数。
class XYZMenuWidget: MenuWidget {
   override fun listener (options: XYZMenuOption) {}
}

但是,问题是我不能使用XYZMenuOption代替MenuOption。我的想法是MenuOption和MenuWidget都是非常通用的,我可以根据需要实现它们以适合特定的菜单选项。

最佳答案

覆盖父函数时不能更改参数类型。在这种情况下,您有2种选择,具体取决于您的最终目标是:

  • 如果您希望XYZMenuWidget仅接受XYZMenuOption,请使用泛型:
    interface MenuOption {
       val name: String
    }
    
    data class XYZMenuOption (override val name: String) : MenuOption
    
    // You must make class open in other to extend from it
    open class MenuWidget<T : MenuOption> {
    
    // You must make function open in other to override!
        open fun listener (options: T) {}
    }
    
    class XYZMenuWidget(): MenuWidget<XYZMenuOption>() {
        // Listener now only accepts XYZMenuOption
        override fun listener (options: XYZMenuOption) {}
    }
    
  • 使用与父类相同的类型(如果您希望通过MenuOption的任何实现调用监听器:
    interface MenuOption {
        val name: String
    }
    
    data class XYZMenuOption (override val name: String) : MenuOption
    
    // You must make class open in other to extend from it
    open class MenuWidget {
    
        // You must make function open in other to override!
        open fun listener (options: MenuOption) {}
    }
    
    class XYZMenuWidget(): MenuWidget() {
        override fun listener (options: MenuOption) {}
    }
    
  • 07-27 16:46