对于一个抽象类,我试图定义它的一些方法,所以我不必为每个子类。我正在尝试执行此操作的方法之一需要返回此类的实例。有没有办法做到这一点,因为我无法实例化该类,因为它是抽象的?
以下是代码示例的片段,但没有任何实际代码,我只是展示它以使我的问题更清晰。将要做的是创建一个新的ListHolder,它是原始的ListHolder加上参数ListHolder以及两者的所有元素。不在列表中,而是ListHolder。
abstract class ListHolder {
def /(other: ListHolder) : ListHolder = ???
}
我是否可以在抽象级别实现/
方法,因为它必须返回ListHolder
?
答案 0 :(得分:1)
您可以通过实例化匿名子类来实例化一个抽象类:
new ListHolder {}
也许吧?:
abstract class ListHolder {
def /(other: ListHolder) : ListHolder = new ListHolder {}
}
class SomeListHolder extends ListHolder
new SomeListHolder / new SomeListHolder
// res0: ListHolder = ListHolder$$anon$1@520a06c6
或者您可以返回特定的预选子类型:
abstract class ListHolder {
def /(other: ListHolder) : ListHolder = new SomeListHolder
}
new SomeListHolder / new SomeListHolder
// res0: ListHolder = SomeListHolder@483edb6b
答案 1 :(得分:1)
您可以使用this.type
:
trait AbstractFuncs {
def someFunc: this.type = {
// do something...
this
}
}
case class A(val i: Int) extends AbstractFuncs
case class B(val j: Double) extends AbstractFuncs
val a1 = A(10)
val b1 = B(15.13)
val a11: A = a1.someFunc
val b11: B = b1.someFunc
答案 2 :(得分:0)
在def abstract ListHolder makeNew(...)
中使用ListHolder
或其他内容怎么样?然后,您只需在子类型中重新定义该部分,并在ListHolder中保留/
的其余实现。
如果不知道/
做什么,就很难更准确。
对于是否允许/使用两个不同类型的参数,以及是否要保证返回类型与操作数的实际类型(需要类型参数或抽象)相同,可能还有疑问类型成员)