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