Наследование или перечисление

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

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

Например:

Книги

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,
...
}
7
задан user278618 24 June 2010 в 07:51
поделиться

8 ответов

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

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

22
ответ дан 6 December 2019 в 06:23
поделиться

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

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

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

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

3
ответ дан 6 December 2019 в 06:23
поделиться

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

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

2
ответ дан 6 December 2019 в 06:23
поделиться

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

2
ответ дан 6 December 2019 в 06:23
поделиться

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

0
ответ дан 6 December 2019 в 06:23
поделиться

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

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

0
ответ дан 6 December 2019 в 06:23
поделиться

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

0
ответ дан 6 December 2019 в 06:23
поделиться

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

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

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

Пока!

-1
ответ дан 6 December 2019 в 06:23
поделиться
Другие вопросы по тегам:

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