Scala:将abtract类作为对象,在普通类中声明时可以更改

Scala:将abtract类作为对象,在普通类中声明时可以更改,scala,inheritance,abstract-class,Scala,Inheritance,Abstract Class,例如,我有以下代码: abstract class A { def functionA() { val a : A = null; // take null just for temporary, because I cannot think what should to put here a.functionB } def functionB() { print("hello") } } class C extends A{ } object

例如,我有以下代码:

abstract class A {
  def functionA() {
    val a : A = null; // take null just for temporary, because I cannot think what should to put here
    a.functionB
  }

  def functionB() {
      print("hello")
  }
}

class C extends A{
}

object Main extends App {
  val c : C = new C()
  c.functionB // print hello
  c.functionA // ERROR
}
function
,我想声明一个对象,以防:如果当前类是C,a将具有类型C。如果当前类是D,a将具有类型D。因为我无法执行以下操作:

val a : A = new A // because A is abstract
在Java中,我可以很容易地做到这一点,但在Scala中我无法做到这一点。请帮我这个

谢谢:)

我想声明一个对象,以防万一:如果当前的类是C,那么 具有类型C。如果当前类为D,则a将具有类型D

如果我理解正确的话,您所说的是纯继承多态性。在您的案例中,您可以将
引用指定给
一个
值,或者直接使用它:

abstract class A {
  def functionA {
    this.functionB
  }

  def functionB {
    print("hello")
  }
}

class C extends A{
}

object Main extends App {
  val c : C = new C()
  c.functionB
  c.functionA
}
在这种情况下,将不会出现
NullPointerException

但是,如果您真的想在基类中创建新的真正类型的对象,那么您应该以其他方式使用继承多态性(我认为这比whan@brunoconde建议的要简单一些,但想法非常相似;我认为这里不需要泛型):


如果有必要,我会在Java中这样做。但是,您必须在每个子类中重写
create()
方法。我怀疑在不使用反射的情况下不进行重写就可以做到这一点。

在Java中如何做到这一点?您采用的是一些复杂的逻辑。这是重新考虑设计的可靠标志。
abstract class A {
  def functionA {
    val a : A = create()
    a.functionB
  }

  def functionB {
    print("hello")
  }

  def create(): A
}

class C extends A {
  override def create() = new C
}