struct Animal {
std::string name;
std::string favoriteDrink;
bool canFly;
bool canSing;
};
Не стесняйтесь обернуть get / setters вокруг участников, если это делает вас счастливыми.
Но люди склонны забывать одну вещь: полиморфизм - это поведение .Речь идет о создании разных классов, которые выглядят одинаково, но ведут себя по-разному.
В этом примере нет различий в поведении между любыми животными, и поэтому создание более одного классаoverkill.
Фактическое поведение не требуется ни для одного из животных.Единственные операции, которые нам нужны, - это возможность спросить «как его зовут», «может ли он летать», «может ли он петь» (и, конечно, «будет ли он смешиваться?»)
Все эти операцииимеет такой же смысл для пингвинов, как и для терьера, синего кита или строптивой.Поведение такое же, меняются только данные.Итак, это должен быть один класс с разными экземплярами для разных животных.
И поэтому попытка разделить их на отдельные классы идет вразрез со всеми целями ООП: в конечном итоге вы намеренно дублируете код, делая меньше повторного использования кода, и вы делаете ваш код меньше полиморфным, а не больше.В моем решении, любое животное является заменой любого другого животного.Как только вы начнете возиться с различными классами и виртуальными методами, вам нужно будет написать новый код для каждого нового животного, чтобы он был подходящей реализацией базового класса Animal
.
Если вам когда-либо понадобитсяЧтобы добавить метод Fly()
, вам могут потребоваться другие классы.Механика полета различна для воробья, орла и летучей мыши (хотя даже это зависит от цели. В зависимости от того, на каком уровне абстракции работает приложение, процедура «полета» может состоять не более чем из установки другого * 1028).* флаг где-нибудь, или, возможно, предоставление животному положительной ненулевой высоты, и в этом случае та же самая реализация может использоваться для любого летающего животного).
Но на данный момент все, что нам нужноэто способность спрашивать может ли животное летать.И реализация , что , можно использовать многократно.
Но, конечно, из поставленной задачи ясно, что правильный ответ (где «правильный» определяется как «я ожидал, когдаЯ задал вопрос "это" использовать множество виртуальных методов для всего и дать всему свой класс ".
Это просто показывает, что чем больше ООП-фанатизма вы получаете от кого-то,чем ниже вероятность того, что они на самом деле понимают ООП.
См. также мой пост в блоге на тему