我有这样的界面。
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种选择,具体取决于您的最终目标是:
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) {}
}