Наследование или перечисление - PullRequest
7 голосов
/ 24 июня 2010

Я должен структурировать новую модель для приложения, и я не знаю, что лучше:

использование наследования или использование enum в качестве типа объекта:

Например:

Книга

class Book
{
public string Name {get;set;}

public string Author {get;set;}

public int NumberOfPages {get;set;}

}

public class Encyclopedie:Book
{

}

public class Novel:Book
{

}

или лучше использовать:

class Book
{

public BookType Type {get;set;}

public string Name {get;set;}

public string Author {get;set;}

public int NumberOfPages {get;set;}

}

public enum BookType
{
Encyclopedie = 0,
Novel = 1,
...
}

Ответы [ 8 ]

22 голосов
/ 24 июня 2010

Используйте наследование, если разные типы имеют существенные различия (как вы обрабатываете их и обрабатываете их).То есть, если вы собираетесь использовать полиморфизм вообще, вы должны использовать наследование.

Если вам нужен только способ различать разные типы книг, используйте Enum.

3 голосов
/ 24 июня 2010

В реальных объектно-ориентированных системах тип объекта прозрачен для клиента.Таким образом, код, который обрабатывает книги, не должен знать, какой тип книги, а только вызывать методы для книг.

Так что, если вам нужно реализовать другое поведение в книге в ответ на вызов метода, расширьте Book и переопределите некоторые из его методов.Если нет, то не надо.

По пустым телам ваших подклассов кажется, что они ведут себя так же, как и книги.Таким образом, вы просто помечаете книгу некоторыми дополнительными данными - разница между Энциклопедией и Романом не более важна для книги, чем твердый или мягкий переплет, или крупный или стандартный шрифт - клиент может использовать их по-разному, и каждая книга является большойпечатать книгу или это стандартная печатная книга, но это все атрибуты книги, а не существенные различия.

Я бы не стал использовать enum для вида книги, так как вы можете добавить больше данных- Я бы либо использовал свободную систему тегов, чтобы вы могли пометить книгу набором видов - так, чтобы у вас была книга с тегами {'children', 'ornithological', 'encyclopaedia',} - или разрешить структуру вроли - так что есть роль для «детской орнитологической энциклопедии», созданной тогда, когда она требуется, но без фиксированного перечисления.

2 голосов
/ 24 июня 2010

«лучший» субъективен и сильно зависит от цели класса / модели. Какова ваша цель? Чего ты хочешь достичь?

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

2 голосов
/ 24 июня 2010

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

0 голосов
/ 24 июня 2010

Я думаю, что вы должны сделать этот выбор, основываясь на том, что книга "цель". Если книгам не нужны никакие дополнительные вещи (методы и свойства ...), перечисления должно быть достаточно. Если вам нужно создать общее поведение для каждой книги и что-то еще более специфичное для каждого типа книги, вам, очевидно, необходимо наследование (абстрактный класс «книга» и конкретные классы).

0 голосов
/ 24 июня 2010

Использование enum для «ввода» вашего объекта звучит немного как «старый стиль C».

Я имею в виду, это нормально, но когда доступно наследование (вы используете C #), это, как правило, лучший выбор. Перечисление обычно создает некоторые «проблемы», например, при сериализации / десериализации данных: что, если в старой версии вашего приложения используется «более новый» сценарий, в котором BookType содержит неизвестный элемент? (обратная / прямая совместимость может быть требованием для вашего приложения)

Конечно, вы можете справиться с этим с помощью "если-то-еще", но на мой взгляд, наследование кажется более чистым выбором.

Bye!

0 голосов
/ 24 июня 2010

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

Если они все будут иметь одинаковые атрибуты, вы можете также использовать перечисление.Но все зависит от приложения.

0 голосов
/ 24 июня 2010

Это действительно зависит. Первое решение лучше, если вам нужно использовать полиморфизм. По моему личному мнению, я предпочитаю использовать наследование.

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