2017-01-24 3 views
0

Что означает следующее и как я могу его использовать?Абстрактный метод возвращает базовый класс. Что это значит?

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

Я знаю, что не может быть экземпляр или объект из абстрактного класса, так что этот метод действительно возвращается?

Может ли это использоваться для создания списка или двоичного дерева?

Является ли это лучшей техникой, чем конкретным классом и почему?

+0

Аннотация Класс - это модель для другого класса, вам нужно ее реализовать - они не содержат реализацию для методов. Вы должны создать класс, унаследованный от абстрактных и переопределяющих методов. – themoah

ответ

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 более идиоматический подход к этому будет заключаться в использовании реализаций класса признаков и case.

Смежные вопросы