抽象方法返回基类。这是什么意思?

时间:2017-01-24 10:31:58

标签: scala abstract-class

以下是什么意思以及如何使用它?

abstract class An_Abstract_Class {
   def A_method(x : Int) : An_Abstract_Class
}

我知道抽象类中不能有实例或对象,所以这个方法实际返回了什么?

这可以用于创建列表或二叉树吗?

这是一个比具体课更好的技术吗?为什么?

1 个答案:

答案 0 :(得分:2)

正如您所指出的,这个类是抽象的,所以它不能是它的任何直接实例。这意味着需要有子类,这些子类必须实现A_method。那些子类将返回什么?也许是自己的实例,因为它们是An_Abstract_Class的子类,它们满足返回类型。

例如:

class A_Concrete_Class extends An_Abstract_Class {
  def A_method(x:Int) : An_Abstract_Class = this
}

有趣的是,您也可以这样做:

class A_Concrete_Class extends An_Abstract_Class {
  def A_method(x:Int) : A_Concrete_Class = this
}

不同之处在于被覆盖的A_method指定了返回类型A_Concrete_Class。由于这是An_Abstract_Class的子类,因此编译就可以了。这被称为"共变体返回类型" - 即允许子类实现的返回类型是基类返回类型的子类型。

你确实可以使用这种东西来实现一个二叉树,尽管在Scala中,更惯用的方法是使用特征和案例类实现。