实例化一个抽象类Scala?可能吗?

时间:2015-02-20 15:26:08

标签: scala abstract-class

对于一个抽象类,我试图定义它的一些方法,所以我不必为每个子类。我正在尝试执行此操作的方法之一需要返回此类的实例。有没有办法做到这一点,因为我无法实例化该类,因为它是抽象的?

以下是代码示例的片段,但没有任何实际代码,我只是展示它以使我的问题更清晰。将要做的是创建一个新的ListHolder,它是原始的ListHolder加上参数ListHolder以及两者的所有元素。不在列表中,而是ListHolder。

abstract class ListHolder {
    def /(other: ListHolder) : ListHolder = ???
}

我是否可以在抽象级别实现/方法,因为它必须返回ListHolder

3 个答案:

答案 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中保留/的其余实现。

如果不知道/做什么,就很难更准确。

对于是否允许/使用两个不同类型的参数,以及是否要保证返回类型与操作数的实际类型(需要类型参数或抽象)相同,可能还有疑问类型成员)