Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Небольшой вопрос по проектированию

1.9K
12 июня 2005 года
solovey
113 / / 25.07.2004
Делаю упражнение из Страуструпа, связанное с графикой. Вот краткая его суть:"Имеется класс Window, который представляет окно в операционной системе. Этот класс имеет данные - текущая точка в окне в декартовых координатах. Имеются фигуры. Фигуры спроектированы как дерево классов: базовый - Shape, наследники - Line, Rectangle,... . Класс Window имеет метод - draw(Shape & ), который рисует фигуру." Я решил реализовать все это дело следующим образом:
Абстрактный класс
 
Код:
class Shape
{
    public:

        virtual void draw(CWnd * window) = 0;//window - указатель на окно, в котором рисовать фигуру
        virtual ~Shape(){};
};


Класс окна я создал следующим образом
 
Код:
class MyWnd
{
    CWnd * pWnd;

    public:
        MyWnd(CWnd * Wnd):pWnd(Wnd){};
        void draw(Shape & figure);
        Point current();
        Point current(Point p);
};

Реализация класса именно таким способом обусловлена тем, что за основу был взят проект MFC Application->Dialog Based, в котором автоматически уже создается объект типа CWnd, а мне остается только скопировать указатель на него в мой класс.

Теперь вопрос: может лучше было реализовать Shape как наследник MyWindow? Тогда не надо бы было каждый раз передавать указатель на окно, в котором рисовать. С другой стороны такой подход позволяет одну и ту же фигуру рисовать в любом существующем окне. Также интересен и ваш личный выбор в подобной ситуации, естественно желательно с аргументами :)
425
14 июня 2005 года
sq_deep
498 / / 18.02.2005
Shape не должен быть наследником MyWnd. Наследование предполагает некую "родственность" объектов. Оно должно расширять или уточнять функциональность базового класса. В вашем случае это не очень видно из-за чрезмерной простоты примера и ещё потому, что как MyWnd, так и Shape — геометрические объекты.

Если взять другой стандартный пример — «зоопарк», — то там всё становится более понятно.

Там есть абстрактный класс Животное, наследниками которого будут классы Змея и Медведь. У всех этих классов будет функция
virtual COLORREF Цвет(); // Цвет животного

Ешё пусть будет класс Клетка (в котором животное отбывает свой срок). У этого класса тоже есть функция
COLORREF Цвет(); // Цвет клетки

Может возникнуть желание наследовать
class Животное: public Клетка

Это желание надо подавить, потому что в классе Животное рано или поздно возникнет функция
virtual bool ПораКормить(); // true, если проголодалось
Эта функция для клетки не имеет смысла. Зато имеет смысл функция
bool ПораКрасить();
которая не имеет смысла для животного.

В вашем случае MyWnd = Клетка, Shape = Животное: каждый объект Shape "сидит в клетке" MyWnd, но при этом объекты Shape не являются объектами MyWnd. Эти объекты "чужды" друг другу. Поэтому наследование
class Shape: public MyWnd
сделать, конечно, можно, но не стоит.
1.9K
14 июня 2005 года
solovey
113 / / 25.07.2004
Цитата:
Originally posted by sq_deep
Shape не должен быть наследником MyWnd. Наследование предполагает некую "родственность" объектов. Оно должно расширять или уточнять функциональность базового класса. В вашем случае это не очень видно из-за чрезмерной простоты примера и ещё потому, что как MyWnd, так и Shape — геометрические объекты.

Если взять другой стандартный пример — «зоопарк», — то там всё становится более понятно.

Там есть абстрактный класс Животное, наследниками которого будут классы Змея и Медведь. У всех этих классов будет функция
virtual COLORREF Цвет(); // Цвет животного

Ешё пусть будет класс Клетка (в котором животное отбывает свой срок). У этого класса тоже есть функция
COLORREF Цвет(); // Цвет клетки

Может возникнуть желание наследовать
class Животное: public Клетка

Это желание надо подавить, потому что в классе Животное рано или поздно возникнет функция
virtual bool ПораКормить(); // true, если проголодалось
Эта функция для клетки не имеет смысла. Зато имеет смысл функция
bool ПораКрасить();
которая не имеет смысла для животного.

В вашем случае MyWnd = Клетка, Shape = Животное: каждый объект Shape "сидит в клетке" MyWnd, но при этом объекты Shape не являются объектами MyWnd. Эти объекты "чужды" друг другу. Поэтому наследование
class Shape: public MyWnd
сделать, конечно, можно, но не стоит.


спасибо, понял.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог