gpt4 book ai didi

kotlin - Kotlin 中一个类和接口(interface)的多重继承

转载 作者:行者123 更新时间:2023-12-02 12:41:28 28 4
gpt4 key购买 nike

我的预期目标是通过一组固定的属性和方法(其名称不会重叠)从现有库中扩展多个类。

直接的解决方案是简单的继承:派生库类并添加属性/方法。但这将是相当重复的,因为所有派生类的属性和方法都是相同的。最好创建一个具有我需要的所有属性和方法的辅助类,并简单地从库类和辅助类派生扩展类。

然而,在 Kotlin 中似乎没有可与 C++ 相媲美的多重继承,我想使用接口(interface)来使其工作,其中接口(interface)将包含我需要的所有属性和方法。

我从以下简单的代码开始测试接口(interface):

open class LibraryClass{
var x: Int = 0

fun setMyX(x_: Int){
x = x_
}
}

interface MyInterface{
var y: Int
var z: Int
var abc: Int

fun myMethod(y_: Int){
y = y_
z = y*y
}
}

class InheritanceTest: LibraryClass(), MyInterface{
fun print(){
println("My values: $x, $y, $z")
}
}

fun main(){
var test = InheritanceTest()
test.setMyX(1)
test.myMethod(5)
test.print()
}

如果我尝试编译此代码,我将收到以下错误消息:
error: class 'InheritanceTest' is not abstract and does not implement abstract member public abstract var y: Int defined in MyInterface

一些研究表明,我需要在派生类的主构造函数中覆盖接口(interface)的属性:
class InheritanceTest(override var y: Int, override var z: Int, override var abc: Int)

进而
var test = InheritanceTest(2,3,0)

在派生类中覆盖所有(?)接口(interface)属性(甚至是未使用的)似乎非常重复(并且也不可能在接口(interface)中初始化属性),这基本上超出了我最初打算使用接口(interface)的目的:节省重复.
(除了方法,只要一个类和(多个)接口(interface)不共享同名方法,似乎就不必重写)。

我提出的问题是:这是唯一的解决方法或解决错误的方法吗?

然后我在界面中找到了其他可以尝试的东西:
var fgh: Int 
get() { return fgh }
set(v) { fgh = v }

到目前为止不需要覆盖。但是我还不知道如何在方法中或通过设置值来实际使用属性 fgh。

当我尝试通过 test.fgh = 100 设置 fgh 时在 main() ,我收到以下错误:
Exception in thread "main" java.lang.StackOverflowError
at MyInterface$DefaultImpls.setFgh(

然后尝试使用 test.setFgh(100) (因为前面的错误消息暗示该方法存在)产生:
error: unresolved reference: setFgh

试图定义 setFgh(v: Int) {fgh = v}结果是:
error: platform declaration clash: The following declarations have the same JVM signature (setFgh(I)V):
fun <set-fgh>(v: Int): Unit defined in MyInterface
fun setFgh(v: Int): Unit defined in MyInterface

好的,定义一个不同命名的方法,类似于 myMethod() :
fun myOtherMethod(v: Int){    
fgh = v
z = fgh * fgh
}

然后使用 myOtherMethod(10)main()再次给出:
Exception in thread "main" java.lang.StackOverflowError
at MyInterface$DefaultImpls.setFgh

所以,我现在真的不知道要做什么才能获得一个非重复的工作解决方案来扩展具有相同属性和方法的多个类。

编辑:
我现在明白接口(interface)并不是我想要的,因为必须在派生类中实现(而不是覆盖,这需要我一段时间才能得到,因为它是通过关键字“覆盖”完成的)。

最佳答案

你第一次尝试就走在了正确的轨道上。您确实必须覆盖接口(interface)中的属性,但不必在构造函数中完成。您可以在类主体中执行此操作,这样您就可以为它们添加默认值(不仅可以,而且必须)。如果你打开那个类,你就可以在你所有的类中扩展它。

open class InheritanceTest: LibraryClass(), MyInterface {
override var y: Int = 0
override var z: Int = 0
override var abc: Int = 0

fun print() {
println("My values: $x, $y, $z")
}
}

有了这个类,你原来的 main 将打印 My values: 1, 5, 25 ,并且您将能够从此类继承而无需覆盖/初始化任何内容(但您可以使用 init block 来自定义您的父类(super class))。例如:
class MyClass : InheritanceTest() {
init {
myMethod(4)
}
}

fun main() {
val test = MyClass()
test.setMyX(2)
test.print()
}

将打印 My values: 2, 4, 16
我希望我正确理解了您的问题并可以提供帮助:)

关于kotlin - Kotlin 中一个类和接口(interface)的多重继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57671050/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com