Получите абстрактный класс из неабстрактного класса

Это в порядке для получения абстрактного класса из неабстрактного класса или там что-то не так с этим подходом?

Вот немного примера:

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
}

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

40
задан Jehof 3 March 2015 в 18:30
поделиться

4 ответа

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

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

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

Человек - конкретный (не абстрактный)
Родной брат: Человек - абстрактный
Брат: Родной брат - бетон
Сестра: Сиблинг - бетон

57
ответ дан 27 November 2019 в 01:26
поделиться

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

0
ответ дан 27 November 2019 в 01:26
поделиться

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

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

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

18
ответ дан 27 November 2019 в 01:26
поделиться

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

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

13
ответ дан 27 November 2019 в 01:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: