scala: повторно использовать реализацию подкласса как подкласс двух разных классов? - PullRequest
3 голосов
/ 29 апреля 2011

Чтобы упростить мой фактический код, скажем, есть два класса, один подкласс другого:

class Chair {
   val canFold = false;
   // ...
}

class FoldableChair extends Chair {
   val canFold = true;
   // ...
} 

, и в моей реализации у меня будут потенциально сотни других подклассов Chair или FoldableChair:

class Armchair extends ... {}
class DeckChair extends ... {} 
//... etc

Предположим, что для каждого из этих подклассов каждый имеет длинную реализацию, но я хочу иметь возможность иногда расширять его на Chair и иногда на FoldableChair - без дублирования кода.Я хотел бы сделать это без расширения самого подкласса.Возможно ли это как-то?Нужно ли мне использовать черты для этого?

Я также хотел бы иметь возможность создавать особые экземпляры подкласса, которые иногда расширяют Chair, а иногда расширяют FoldableChair, но этот выбор делается при его создании.Это тоже возможно?Спасибо!

Редактировать: чтобы уточнить, что я действительно хочу, это:

class Armchair extends Chair {}

class ArmchairFoldable extends FoldableChair {}

, но реализация Armchair и ArmchairFoldable абсолютно одинаковы.То есть я бы не хотел дублировать их реализации.

1 Ответ

5 голосов
/ 29 апреля 2011

Вы можете использовать черту реализации;т. е. признак, который вы смешиваете с классом и который предоставляет дополнительным членам их реализацию.

Пример:

class Chair {
   // you can use a def rather than a val as it's constant and
   // and doesn't need to occupy a field
   def canFold = false

   // ...
}

class FoldableChair extends Chair {
   override def canFold = true
   // ...
}

trait Extensible extends Chair {
    // this trait extends Chair to mean that it is only
    // applicable to Chair or subclasses of Chair
    def extend = /* ... */
}

class FoldableExtensibleChair extends FoldableChair with Extensible

Тогда вы можете написать:

val a = new Chair // bare-bones chair

// decide at creation time that this one is extensible
val b = new Chair with Extensible

val c = new FoldableChair // non extensible

// use predefined class which already mixes in Extensible
val d = new FoldableExtensibleChair 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...