继承儿童中的同伴Obejct-Kotlin

继承儿童中的同伴Obejct-Kotlin,kotlin,Kotlin,我读过Kotlin中不能重写静态方法的文章,所以我不确定这是否可行,但如果不能做到这一点,将导致大量重复的代码。在将伴生对象移动到父对象时,是否有任何方法可以实现相同的行为?这是我到目前为止所拥有的 Parent.kt 兄弟.kt 妹妹.kt main() 控制台输出: 你好,哥哥你好,姐姐 也许这对你想做的事情有用 可以为执行此模式的对象创建超类: open class SingletonAccessor<T: Any> (private val constructor: () -

我读过Kotlin中不能重写静态方法的文章,所以我不确定这是否可行,但如果不能做到这一点,将导致大量重复的代码。在将
伴生对象
移动到
父对象
时,是否有任何方法可以实现相同的行为?这是我到目前为止所拥有的

Parent.kt 兄弟.kt 妹妹.kt main() 控制台输出

你好,哥哥你好,姐姐


也许这对你想做的事情有用

可以为执行此模式的对象创建超类:

open class SingletonAccessor<T: Any> (private val constructor: () -> T){
    @Volatile private var instance: T? = null
    fun getInstance() = instance ?: synchronized(this) {
        instance ?: constructor().also { instance = it }
    }
}
open类SingletonAccessor(私有val构造函数:()->T){
@易失性私有变量实例:T?=null
fun getInstance()=实例?:已同步(此){
实例?:构造函数()。也是{instance=it}
}
}
然后从您的实现类伴生对象继承它:

class Brother private constructor(): Parent() {
    companion object: SingletonAccessor<Brother>(::Brother)
}

class Sister private constructor(): Parent() {
    companion object: SingletonAccessor<Sister>(::Sister)
}
class Brother私有构造函数():Parent(){
伴随对象:SingletonAccessor(::Brother)
}
类姐妹私有构造函数():父类(){
伴随对象:SingletonAccessor(::Sister)
}

这种模式与简单地创建兄弟姐妹对象没有太大区别,因为它们没有构造函数参数,但这可能只是一个简化的示例。

也许这将适用于您尝试执行的操作

可以为执行此模式的对象创建超类:

open class SingletonAccessor<T: Any> (private val constructor: () -> T){
    @Volatile private var instance: T? = null
    fun getInstance() = instance ?: synchronized(this) {
        instance ?: constructor().also { instance = it }
    }
}
open类SingletonAccessor(私有val构造函数:()->T){
@易失性私有变量实例:T?=null
fun getInstance()=实例?:已同步(此){
实例?:构造函数()。也是{instance=it}
}
}
然后从您的实现类伴生对象继承它:

class Brother private constructor(): Parent() {
    companion object: SingletonAccessor<Brother>(::Brother)
}

class Sister private constructor(): Parent() {
    companion object: SingletonAccessor<Sister>(::Sister)
}
class Brother私有构造函数():Parent(){
伴随对象:SingletonAccessor(::Brother)
}
类姐妹私有构造函数():父类(){
伴随对象:SingletonAccessor(::Sister)
}

这个模式与简单地创建Brother and Sister
对象没有太大区别,因为它们没有构造函数参数,但这可能只是一个简化的示例。

基于@Tenfour04的回答,我提出了另一种方法,将
SingletonAccessor
合并到
父对象中

abstract class Parent<T>(private val constructor: () -> T) {

    @Volatile private var instance: T? = null
    protected val TAG = this::class.java.simpleName

    fun getInstance() = instance ?: synchronized(this) {
        instance ?: constructor().also { instance = it }
    }
}
抽象类父类(私有val构造函数:()->T){
@易失性私有变量实例:T?=null
protected val TAG=this::class.java.simpleName
fun getInstance()=实例?:已同步(此){
实例?:构造函数()。也是{instance=it}
}
}
在儿童中的实施与以前相同


让我知道这个答案是否可以进一步改进。特别是,我想在类声明
class Parent
中这样做,但这并不编译。有没有办法将类型参数限制在它自己和它的子项上?

根据@Tenfour04的回答,我想出了另一种方法,它将
SingletonAccessor
合并到
父项

abstract class Parent<T>(private val constructor: () -> T) {

    @Volatile private var instance: T? = null
    protected val TAG = this::class.java.simpleName

    fun getInstance() = instance ?: synchronized(this) {
        instance ?: constructor().also { instance = it }
    }
}
抽象类父类(私有val构造函数:()->T){
@易失性私有变量实例:T?=null
protected val TAG=this::class.java.simpleName
fun getInstance()=实例?:已同步(此){
实例?:构造函数()。也是{instance=it}
}
}
在儿童中的实施与以前相同


让我知道这个答案是否可以进一步改进。特别是,我想在类声明
class Parent
中这样做,但这并不编译。有没有办法将类型参数限制为自身及其子项?

你真是个天才!你真是个天才!只是挑剔一下术语:Kotlin没有静态方法。  (伴生对象实现了大部分相同的功能,但方式更加灵活。)  您可能会想到Java,它拥有它们——但它们不能在Java中被覆盖。  这是因为它们是从引用类型静态解析的(在编译时)。  (在对象上调用静态方法只是在引用的类上调用它的语法糖。)在这种情况下,您可能可以用更简单的方法来做您想做的事情。只是对术语进行了挑剔:Kotlin没有静态方法。  (伴生对象实现了大部分相同的功能,但方式更加灵活。)  您可能会想到Java,它拥有它们——但它们不能在Java中被覆盖。  这是因为它们是从引用类型静态解析的(在编译时)。  (在对象上调用静态方法只是在引用的类上调用静态方法的语法糖。)在这种情况下,您可以用一种更简单的方法来处理它。
abstract class Parent<T>(private val constructor: () -> T) {

    @Volatile private var instance: T? = null
    protected val TAG = this::class.java.simpleName

    fun getInstance() = instance ?: synchronized(this) {
        instance ?: constructor().also { instance = it }
    }
}