crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Динамическая типизация, как-то так
jerdeks
  опции профиля:
сообщение 16.9.2011, 12:23
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 6
Регистрация: 14.9.2011
Пользователь №: 2874

Спасибо сказали: 0 раз(а)




Репутация:   0  


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

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


И даже работает, но потом мне надо определить, что же это за класс. Нет, можно конечно переменную завести, но может как-то красивее можно это сделать? Или может вообще то что я написал не правильно?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silver47
  опции профиля:
сообщение 16.9.2011, 13:10
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 356
Регистрация: 1.4.2010
Пользователь №: 1584

Спасибо сказали: 40 раз(а)




Репутация:   6  


Если на этапе создание объекта Вы уже знаете его тип, то, как мне кажется, лучше и создавать прямоугольник или эллипс. Если у них большая часть методов сходны, если лишь небольшие различия, то создайте свой класс ФИГУРА, а эллипс и прямоугольник унаследуйте от него, переопределив некоторые методы, в которых есть различия. Это больше соответствует идеологии ООП, и добавлять новый фигуры будет проще.

Сообщение отредактировал silver47 - 16.9.2011, 13:12
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
jerdeks
  опции профиля:
сообщение 16.9.2011, 13:22
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 6
Регистрация: 14.9.2011
Пользователь №: 2874

Спасибо сказали: 0 раз(а)




Репутация:   0  


silver47, так-то оно так, но у меня такой случай, что так удобнее :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silver47
  опции профиля:
сообщение 16.9.2011, 14:51
Сообщение #4


Активный участник
***

Группа: Участник
Сообщений: 356
Регистрация: 1.4.2010
Пользователь №: 1584

Спасибо сказали: 40 раз(а)




Репутация:   6  


Ну тогда городите конструктор с булевым аргументом. Сделайте переменную типа classType и метод для ее получения getType().
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 17.9.2011, 19:35
Сообщение #5


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


вроде в Boost'е уже есть готовое решение.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Sokoloff
  опции профиля:
сообщение 18.9.2011, 9:00
Сообщение #6


Участник
**

Группа: Участник
Сообщений: 237
Регистрация: 1.4.2009
Из: Москва
Пользователь №: 654

Спасибо сказали: 50 раз(а)




Репутация:   11  


Если сделать класс наследником от QObject, то можно использовать qobject_cast.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 18.9.2011, 11:29
Сообщение #7


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Sokoloff @ 18.9.2011, 12:00) *
Если сделать класс наследником от QObject
тема в разделе С++, стало быть Qt нет
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Goliath
  опции профиля:
сообщение 22.9.2011, 13:06
Сообщение #8


Новичок


Группа: Новичок
Сообщений: 5
Регистрация: 20.9.2011
Пользователь №: 2891

Спасибо сказали: 0 раз(а)




Репутация:   0  


мне кажется здесь стоит вообще пойти немного другим путём, изменив немного архитектуру. Посмотрите паттерн "Абстрактная фабрика". Там как раз ваш случай рассматривается. Я вообще редко встречал подобное решение вашей проблемы.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 19.4.2024, 18:20