2010-04-08 3 views
32

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

Here's немного пример:

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 ​​должен наследовать функциональность от Task и добавлять некоторые дополнительные элементы, но я не хочу создавать его напрямую. Необходимо создать экземпляр только производного класса PeriodicalTask.

ответ

49

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

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

Реальный пример:

Person - бетон (неабстрактный)
Sibling: Person - абстрактный
Brother: Sibling - бетон
Sister: Sibling - бетон

+2

Perfect Example Dan –

+0

Хороший пример поэтому принят – Jehof

+0

Вау! Действительно, хороший пример. – ManuelSchneid3r

0

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

+0

Не могли бы вы уточнить? Да, защищенный/внутренний конструктор может предотвратить создание экземпляров «PeriodicalTask». Но также потребовалось бы, чтобы все абстрактные методы/свойства из «Задачи» имели реализации. –

+0

Ничего ... Я пропустил эту задачу не абстрактно. Оба подхода будут работать так же хорошо в этой ситуации. Кроме того, вы не могли заставить кого-то реализовать метод в производном классе. –

+0

@kprobst: Да, я могу это сделать, но тогда я теряю возможность определять абстрактные члены, которые должны быть реализованы производными типами. Виртуальные участники не являются опцией, потому что производные типы должны определять, как они работают – Jehof

17

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

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

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

12

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

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

+0

Его хороший момент. Этот факт я пропустил, потому что наследование из System.Object не должно быть явным. – Jehof

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