Какова общая практика завершения абстрактного класса? - PullRequest
5 голосов
/ 01 июня 2010

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

Каковы наилучшие практики для создания такой структуры? Или это плохой дизайн?

  1. Объявлять абстрактные функции, которые должен реализовать дочерний элемент?
  2. Объявлять нормальные функции, которые переопределяются в дочернем классе?

1 Ответ

1 голос
/ 01 июня 2010

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

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

...