Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Yello
Зарегистрирован: 09.03.2006 Сообщения: 107
|
Добавлено: Пт Окт 06 2006 22:59 Заголовок сообщения: Как должен выглядеть базовый для них? |
|
|
В С++.
Есть два «списковых» класса:
Список I:
Код: |
class polynom;
class mcont{
mcont *nextcont;
monom mm;
friend class polynom;
};
class polynom{
unsigned int nom;
mcont* firstcont;
public:
polynom(void);
polynom(const polynom& p);
~polynom();
polynom& operator =(const polynom& p);
};
|
Список II:
Код: |
class systemop;
class pcont{
pcont *next;
polynom pp;
friend class systemop;
};
class systemop{
unsigned int nop;
pcont* first;
public:
systemop(void);
systemop(const systemop&);
~systemop();
systemop& operator =(const systemop& s);
};
|
Как видите, оба «списка» абсолютно идентичные. И конструкторы, и деструктор, а также присваивание, работают тоже АБСОЛЮТНО ИДЕНТИЧНО (за исключением типов полей mm/pp, да и то лишь в к-ре копий и «=»). Вопрос: какие поля должен содержать БАЗОВЫЙ класс, чтобы все эти 4 метода были описаны в базовом классе (чтобы не писать два раза (почти) одно и то же в порождённых классах)? (В Страустрапе написано для случая, если бы вместо monom mm было monom *mpointer, а мне так не надо). Вообще не понятно – это должен быть «родитель», или я не так понимаю возможности механизма наследования (в порождённом классе можно «добавить новое», но не «заменить» поле)? |
|
Вернуться к началу |
|
|
Kefir
Зарегистрирован: 16.04.2005 Сообщения: 443 Откуда: Пермь
|
Добавлено: Ср Окт 11 2006 12:27 Заголовок сообщения: |
|
|
Есть такая штука как шаблоны или параметризированные классы или generic типы... Короче это все одно и то же... Короче 2 Ваших класса это один шаблон... _________________ Самоловских Виталий aka Kefir |
|
Вернуться к началу |
|
|
kolobok0
Зарегистрирован: 22.04.2005 Сообщения: 253 Откуда: Мсква
|
Добавлено: Ср Окт 11 2006 15:18 Заголовок сообщения: Re: Как должен выглядеть базовый для них? |
|
|
Yello писал(а): | ...Вообще не понятно – это должен быть «родитель», или я не так понимаю возможности механизма наследования (в порождённом классе можно «добавить новое», но не «заменить» поле)? |
фигня заключается в том, что всё в мире относительно... и сам язык плюсы - не регламентирует порядок (эээээээ читай методологию) поиска и нахождения связей типа родитель-ребёнок... Для этого существуют методологии направленные именно на решение таких вопросов "Как перейти от задачи к программированию". Одна из таких метод - есть Объектно Ориентированный Анализ, Проектирование и т.д.. Данная метода строится на нахождении решений опирающихся ТОЛЬКО на ПОСТАВЛЕННУЮ ЗАДАЧУ. Всё лишнее - в топку. Это и есть - самый верный и самый жизненный подход (с точки зрения самих проектов).
Возвращаясь к баранам. Посмотрите на свои классы как на сущности из своей предметной области. И ответьте на вопросы - что у них одинаковое. Только следуйте строго этим правилам - постарайтесь ничего от себя НЕ привносить. Грань между агрегацией и наследованием - очень призрачная. Как говорит сам Буч:
"Если Вы не уверены, что налицо отношение общего и частного (is a), вместо наследования лучше применить агрегацию или что-нибудь ещё."
И ещё... Как лакмусовую бамажку для агрегации, он предлагает слудующую мысль...
Если(и только если) на лицо отношение "целое/часть" между объектами, их классы должны находиться в отношении агрегации друг с другом.
с уважением
(круглый) |
|
Вернуться к началу |
|
|
Yello
Зарегистрирован: 09.03.2006 Сообщения: 107
|
Добавлено: Чт Окт 12 2006 09:07 Заголовок сообщения: |
|
|
to Kefir: Ну, дело в том что я показал НЕ ВСЕ методы, а только СОВПАДАЮЩИЕ (у каждого класса ещё есть несколько методов, которых нет в другом классе). Надо мне было сразу об этом сказать.
Так что в этом случае (как понимаю) шаблон ничего не даст (вот если бы были только те методы, которые я указал - тогда да).
Нет, не агрегирование (наследование). Как позволяет синтаксис С++, можно сделать родитель таким:
class list{
protected:
unsigned int nom;
cont *firstcont;
public:
list(void);
list(const list& a);
~list();
list& operator =(const list& p);
};
class cont{
protected:
cont *nextcont;
friend class list;
};
А затем писать два наследника, НО в их конструкторе копий и присваивании будет ПОХОЖИЙ текст, отличающийся только типом данных в контейнере. То есть два раза написать почти одно и то же. А шаблон делать бесполезно (см. выше).
Может, так и надо (так и пишут)? Кроме того, это дурацкое наследование немного замедлит скорость выполнения (конструктора копий и присваивания). Так и надо? |
|
Вернуться к началу |
|
|
Kefir
Зарегистрирован: 16.04.2005 Сообщения: 443 Откуда: Пермь
|
Добавлено: Чт Окт 12 2006 09:39 Заголовок сообщения: |
|
|
Почему ж не даст. Делай родителя шаблоном и наследуй на здоровье... _________________ Самоловских Виталий aka Kefir |
|
Вернуться к началу |
|
|
kolobok0
Зарегистрирован: 22.04.2005 Сообщения: 253 Откуда: Мсква
|
Добавлено: Чт Окт 12 2006 12:40 Заголовок сообщения: |
|
|
Yello писал(а): | ....Кроме того, это дурацкое наследование немного замедлит скорость выполнения (конструктора копий и присваивания)... |
это Вы погорячились...
(круглый) |
|
Вернуться к началу |
|
|
Yello
Зарегистрирован: 09.03.2006 Сообщения: 107
|
Добавлено: Чт Окт 12 2006 15:25 Заголовок сообщения: |
|
|
to Kefir: спасибо, попробую так. |
|
Вернуться к началу |
|
|
|