Извлечение абстрактного класса из неабстрактного класса - PullRequest
39 голосов
/ 08 апреля 2010

Можно ли выводить абстрактный класс из неабстрактного класса или в этом подходе что-то не так?

Вот небольшой пример:

public class Task {
  // Some Members
}

public abstract class PeriodicalTask : Task {
  // Represents a base class for task that has to be done periodicaly.
  // Some additional Members
}

public class DailyTask : PeriodicalTask {
  // Represents a Task that has to be done daily.
  // Some additional Members
}

public class WeeklyTask : PeriodicalTask {
  // Represents a Task that has to be done weekly.
  // Some additional Members
}

В приведенном выше примере я не хочу делать класс Task абстрактным, потому что я хочу создать его экземпляр напрямую. PeriodicalTask ​​должен наследовать функциональность от Task и добавлять некоторые дополнительные члены, но я не хочу создавать его экземпляры напрямую. Только производный класс PeriodicalTask ​​должен быть создан.

Ответы [ 4 ]

56 голосов
/ 08 апреля 2010

Я не вижу ничего плохого в этом подходе.

У вас может быть какой-то базовый тип, который можно описать в конкретных терминах. Теперь, просто потому, что объект этого типа может быть далее классифицирован в соответствии с некоторым подтипом, из этого не следует, что все такие подтипы столь же конкретны; они могут, в свою очередь, потребовать дальнейшей конкретизации, как бы.

Пример из реальной жизни:

Person - бетон (без абстракций)
Sibling: Person - аннотация
Brother: Sibling - бетон
Sister: Sibling - бетон

18 голосов
/ 08 апреля 2010

Ничего плохого в этом нет.

Если вы посмотрите на большую иерархию, такую ​​как WinForms, вы найдете несколько слоев абстрактных типов.

Задачи MSBuild также являются хорошим (и более актуальным) примером.

13 голосов
/ 08 апреля 2010

Подобные вещи случаются постоянно: все абстрактные классы наследуются от System.Object, класса, который сам по себе не является abstract.

new System.Object() иногда полезен для блокировки, если у вас больше ничего нет, вы можете заблокировать.

0 голосов
/ 08 апреля 2010

Использование абстрактных данных здесь не является правильным подходом, например, используйте защищенный или внутренний конструктор. Это предотвратит непосредственное создание экземпляров PeriodicalTask, но его производные классы по-прежнему будут иметь к нему доступ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...