Russian Qt Forum
Ноябрь 23, 2024, 20:22 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Динамическая типизация, как-то так  (Прочитано 5912 раз)
jerdeks
Гость
« : Сентябрь 16, 2011, 12:47 »

Допустим, у нас есть классы Фигура, Эллипс и Прямоугольник. Я хочу создать класс ЭллипсИлиПрямоугольник, которому ну например в конструктор передаются константа, определяющая, кем ему быть.
Есть мысль сделать так:

Код
C++ (Qt)
class EllipseOrRectangle : Figure
{
public:
  EllipseOrRectangle(что-то, bool figure) {
     if (figure)
        Ellipse(что-то);
     else
        Rectangle(что-то);
  }
}
 

И даже работает, но потом мне надо определить, что же это за класс. Нет, можно конечно переменную завести, но может как-то красивее можно это сделать? Или может вообще то что я написал не правильно?
Записан
ddrtn
Гость
« Ответ #1 : Сентябрь 16, 2011, 12:56 »

Абстрактная фабрика.
в википедии: http://ru.wikipedia.org/wiki/%D0%90%D0%B1%D1%81%D1%82%D1%80%D0%B0%D0%BA%D1%82%D0%BD%D0%B0%D1%8F_%D1%84%D0%B0%D0%B1%D1%80%D0%B8%D0%BA%D0%B0_%28%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%29
Записан
alexman
Гость
« Ответ #2 : Сентябрь 16, 2011, 13:08 »

может как-то красивее можно это сделать?
Куда уж красивее? Название класса
Код:
EllipseOrRectangle 
не пойми какое Подмигивающий
Записан
jerdeks
Гость
« Ответ #3 : Сентябрь 16, 2011, 13:23 »

Это все смехуечки. Да и правильное название. Отражает суть, как ему и положено

Почитал про фабрику. Ни к селу, ни к городу она тут
« Последнее редактирование: Сентябрь 16, 2011, 13:24 от jerdeks » Записан
Rem Norton
Гость
« Ответ #4 : Сентябрь 16, 2011, 13:47 »

У всех потомков QObject есть 2 замечательных метода:
Код
C++ (Qt)
bool QObject::setProperty ( const char * name, const QVariant & value );
QVariant QObject::property ( const char * name ) const;
 

Скорее всего это как раз подойдет: никаких доп. переменных и вся инфа есть.
Записан
Странник
Гость
« Ответ #5 : Сентябрь 16, 2011, 14:16 »

как вы собираетесь использовать класс EllipseOrRectangle? почему бы не создать абстрактный класс фигуры, унаследовать от него Ellipse и Rectangle и пользоваться себе виртуальными методами и прочими cast'ами?
Записан
jerdeks
Гость
« Ответ #6 : Сентябрь 16, 2011, 14:39 »

Лень три наследования делать вместо одного Улыбающийся
Записан
alexman
Гость
« Ответ #7 : Сентябрь 16, 2011, 14:49 »

Это называется через зад.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Сентябрь 16, 2011, 15:24 »

И даже работает, но потом мне надо определить, что же это за класс. Нет, можно конечно переменную завести, но может как-то красивее можно это сделать? Или может вообще то что я написал не правильно?
Сохраните флажок figure в члене класса и добавьте метод IsEllipse возвращающий этот флажок. С именами переменных мрачно - ну если задуман эллипс, то почему флажок figure (да еще и базовый класс есть Figure)?

Ничего плохого/неграмотного нет, просто обычно делают не так: все общее сваливают в базовый класс (Figure) и порожденные классы занимаются только своими делами. Но возможна и до. ситуация: напр класс задуман для чего-то другого и что рисовать (эллипс или прямоугольник) - дело десятое, проще решить флажком.
Записан
jerdeks
Гость
« Ответ #9 : Сентябрь 16, 2011, 16:14 »

С именами переменных мрачно - ну если задуман эллипс, то почему флажок figure (да еще и базовый класс есть Figure)?
Это абстрактный пример, задачка по-сложнее и там все адекватно называется Улыбающийся

Но возможна и до. ситуация: напр класс задуман для чего-то другого и что рисовать (эллипс или прямоугольник) - дело десятое.
Именно!
Записан
jerdeks
Гость
« Ответ #10 : Сентябрь 16, 2011, 16:16 »

Это называется через зад.

Гипер активный житель, вы всегда такой гиперактивный?
Записан
alexman
Гость
« Ответ #11 : Сентябрь 16, 2011, 20:23 »

Лень три наследования делать вместо одного Улыбающийся
А ты всегда такой ленивый?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.149 секунд. Запросов: 23.