如何在不同的类中共享相同的构造函数aka在接口中定义构造函数?

比方说,我有相同的构造函数在Android中的多个自定义视图

class Button: AppCompatButton { constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle) { } constructor(context: Context, attrs: AttributeSet) : super(context, attrs) { } constructor(context: Context) : super(context) { } //Some custom implementation //............ } class TextView: AppCompatTextView { constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle) { } constructor(context: Context, attrs: AttributeSet) : super(context, attrs) { } constructor(context: Context) : super(context) { } //Some custom implementation //............ } 

所以我需要一些接口或基类,它允许我继承多个视图,如TextView,Button,EditText等。

就像是

 abstract class BaseView<T : View> : T { constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle) { } constructor(context: Context, attrs: AttributeSet) : super(context, attrs) { } constructor(context: Context) : super(context) { } } 

要么

 interface ViewConstructor { constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle) { } constructor(context: Context, attrs: AttributeSet) : super(context, attrs) { } constructor(context: Context) : super(context) { } } 

所以我只使用一个接口或基类,不要一次次复制过去的承包商。如何在Kotlin中实现这样的目标?

PS请不要建议使用基类作为查看并使用基类创建派生视图。 我正在使用XML,我需要EditText,Button和其他视图。

作为必须编写许多构造函数的解决方案,可以使用默认参数和@JvmOverloads来轻松获取所有4个View构造函数,而只需要为您的类编写主构造函数:

 class CustomView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0, defStyleRes: Int = 0 ) : View(context, attrs, defStyleAttr, defStyleRes) { } 

你很难找到解决问题的办法。 首先,构造函数不是按照你的建议继承的。 它们存在初始化你的继承链的一部分,所以任何从你继承的人仍然需要转发到超类的构造函数。 我相当肯定你被卡在每个View类中重新声明这些视图构造函数(尽管其中一些可能会基于你的实例化用例而放弃)。