Russian Qt Forum

Программирование => С/C++ => Тема начата: jerdeks от Сентябрь 16, 2011, 12:47



Название: Динамическая типизация, как-то так
Отправлено: jerdeks от Сентябрь 16, 2011, 12:47
Допустим, у нас есть классы Фигура, Эллипс и Прямоугольник. Я хочу создать класс ЭллипсИлиПрямоугольник, которому ну например в конструктор передаются константа, определяющая, кем ему быть.
Есть мысль сделать так:

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

И даже работает, но потом мне надо определить, что же это за класс. Нет, можно конечно переменную завести, но может как-то красивее можно это сделать? Или может вообще то что я написал не правильно?


Название: Re: Динамическая типизация, как-то так
Отправлено: ddrtn от Сентябрь 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


Название: Re: Динамическая типизация, как-то так
Отправлено: alexman от Сентябрь 16, 2011, 13:08
может как-то красивее можно это сделать?
Куда уж красивее? Название класса
Код:
EllipseOrRectangle 
не пойми какое ;)


Название: Re: Динамическая типизация, как-то так
Отправлено: jerdeks от Сентябрь 16, 2011, 13:23
Это все смехуечки. Да и правильное название. Отражает суть, как ему и положено

Почитал про фабрику. Ни к селу, ни к городу она тут


Название: Re: Динамическая типизация, как-то так
Отправлено: Rem Norton от Сентябрь 16, 2011, 13:47
У всех потомков QObject есть 2 замечательных метода:
Код
C++ (Qt)
bool QObject::setProperty ( const char * name, const QVariant & value );
QVariant QObject::property ( const char * name ) const;
 

Скорее всего это как раз подойдет: никаких доп. переменных и вся инфа есть.


Название: Re: Динамическая типизация, как-то так
Отправлено: Странник от Сентябрь 16, 2011, 14:16
как вы собираетесь использовать класс EllipseOrRectangle? почему бы не создать абстрактный класс фигуры, унаследовать от него Ellipse и Rectangle и пользоваться себе виртуальными методами и прочими cast'ами?


Название: Re: Динамическая типизация, как-то так
Отправлено: jerdeks от Сентябрь 16, 2011, 14:39
Лень три наследования делать вместо одного :)


Название: Re: Динамическая типизация, как-то так
Отправлено: alexman от Сентябрь 16, 2011, 14:49
Это называется через зад.


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

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


Название: Re: Динамическая типизация, как-то так
Отправлено: jerdeks от Сентябрь 16, 2011, 16:14
С именами переменных мрачно - ну если задуман эллипс, то почему флажок figure (да еще и базовый класс есть Figure)?
Это абстрактный пример, задачка по-сложнее и там все адекватно называется :)

Но возможна и до. ситуация: напр класс задуман для чего-то другого и что рисовать (эллипс или прямоугольник) - дело десятое.
Именно!


Название: Re: Динамическая типизация, как-то так
Отправлено: jerdeks от Сентябрь 16, 2011, 16:16
Это называется через зад.

Гипер активный житель, вы всегда такой гиперактивный?


Название: Re: Динамическая типизация, как-то так
Отправлено: alexman от Сентябрь 16, 2011, 20:23
Лень три наследования делать вместо одного :)
А ты всегда такой ленивый?