在 Kotlin 中是否有一种继承构造函数的方法?

15

我有一个Parent类,它被很多子类继承,我想避免在每个子类中复制冗长的构造函数,因为它们都是相同的。

open class Parent(arg1: Any, arg2: Any, arg3: Any...)

class ChildA(arg1: Any, arg2: Any, arg3: Any...): Parent(arg1, arg2, arg3...)
class ChildB(arg1: Any, arg2: Any, arg3: Any...): Parent(arg1, arg2, arg3...)
[...]

有没有一种方法可以继承构造函数或者在Parent中实现一个用于实例化Child类的函数?

编辑

我的期望是能够在不定义其构造函数的情况下实现Child类。原因是我有大约15个子类,每个参数都有可选值,所以最终代码看起来不是很美观。


1
你有没有看过这个 https://dev59.com/FFcP5IYBdhLWcg3wLnRC? - AskNilesh
你可以使用设计构建器模式来处理参数过多的情况。 - Jeel Vankhede
你的期望是什么? - sasikumar
“也许在父类中实现一个函数来实例化子类”和“我有大约15个子类,每个参数都有一个可选值”听起来像是一个不好的设计。这样做意味着您想要实现一些逻辑,根据参数值选择要实例化哪个类。通常使用工厂模式来完成此操作。但我建议退后一步,尝试弄清楚这种方法是否过于通用:一个方法应该能够创建完全不同类的实例吗?参数值与子类之间的实际关系是什么? - JimmyB
@JimmyB 我最终的目标是实现一个回调系统。父类是 GenericCallback<T> ,子类是它的实现(例如 IntCallback: GenericCallback<Int>)。我认为这是一个好的解决方案,因为每个实现需要特定的代码来“知道”如何将回调结果转换为 T(因此,我需要15种实现方式)。为了回答你的问题,参数需要关于 T 的信息。 - Pau Garcia Gozàlvez
显示剩余2条评论
1个回答

9
如果参数始终相同(或仅扩展),您可以创建一个类来保存这些参数:
data class ConstructorParams(arg1: Any, arg2: Any, arg3: Any...)

open class Parent(params: ConstructorParams)

class ChildA(params: ConstructorParams) : Parent(params)

class ChildB(params: ConstructorParams, extraParam: Int) : Parent(params)

你可以添加一个帮助函数来避免在实例化类时显式使用ConstructorParams,但这会有一定的性能折衷(尽管这个版本对于Child2不起作用):
inline fun <reified T : Parent> create(arg1: Any, arg2: Any, arg3: Any...) = 
    T::class.primaryConstructor.call(ConstructorParams(arg1, arg2, ...))

create<Parent>(1, 2, "")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接