Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Полиморфизм для переменной [D7, WinXP]


a80h19 ©   (2005-06-01 13:42:00) 

Условия задачи:
Есть класс Г и его потомки А и Б.
В Г объявлена переменная Figura некоего типа (тоже клас из GlScene-библиотечки)
В А и Б эта переменная объявлена по новой с другими типами (различные геометрические фигуры).
И еще есть список TListObject, куда в беспорядке напиханы экземпляры классов А и Б.

Внимание вопрос:
    p := List.Items[i];
Почему Г(p).Figura = nil, ведь А(p).Figura = значение
Г(p).Figura должен содержать значение потомка


a80h19   (2005-06-01 14:54:00) [1]


> Ega23 ©   (01.06.05 14:45) [14]
> Зачем? Если TGLSphere потомок TGLQuadricObject, то смело
> присваивай  свойству Figura.


> Digitman ©   (01.06.05 14:50) [16]
> выясни, какой ближайший общий предок у TGLQuadricObject,
> ТGLSphere и иже с ними

ОК, это и было решение задачи

Всем большое спасибо за помощь!


Digitman   (2005-06-01 14:50:00) [2]


> a80h19 ©   (01.06.05 14:47) [15]


выясни, какой ближайший общий предок у TGLQuadricObject, ТGLSphere и иже с ними


a80h19   (2005-06-01 14:47:00) [3]


> Digitman ©   (01.06.05 14:43) [12]

Как вариант.
После каждого ".." будет стоять одинаковый код.


Ega23   (2005-06-01 14:45:00) [4]


 А = class(Г)
  private
    FFigura: TGLSphere;
  public
    property Figura: TGLSphere read FFigurawrite FFigura;
end;


Зачем? Если TGLSphere потомок TGLQuadricObject, то смело присваивай  свойству Figura.


a80h19   (2005-06-01 14:44:00) [5]

     p := Г(Scenario.Items[i]);

     if (p.Figura = Значение) then ...

вместо
     if ((p.ClassType = fgPosition) and (fgPosition(p).Figura = PickedObject)) or
     ((p.ClassType = fgDivider) and (fgDivider(p).Figura = PickedObject)) then...


Digitman   (2005-06-01 14:43:00) [6]

а тут и "полиморфности" никакой не требуется

если св-ва Figure всех трех классов у тебя являются классами с общим предком (на худой конец - TObject), то достаточно только одного поля FFigure в классе Г.

тогда

if p is Г then
 TSomeClass1(Г(p).Figure) := ..
else if p is А then
 TSomeClass2(А(p).Figure) := ..
else
 TSomeClass3(Б(p).Figure) := ..


a80h19   (2005-06-01 14:42:00) [7]

Чтобы нагляднее было:

 Г = class
   private
     FFigura: TGLQuadricObject;
   public
     property Figura: TGLQuadricObject read FFigura write FFigura;
 end;

 А = class(Г)
   private
     FFigura: TGLSphere;
   public
     property Figura: TGLSphere read FFigurawrite FFigura;
 end;


a80h19   (2005-06-01 14:41:00) [8]

неизвестно, какому классу принадлежит p
Это может быть А. А может быть и Б.

Суть в том, чтобы получив значение из списка объектов не заморачиваться проверкой к какому конкретно классу принадлежит объект и писать для каждого идентичный код.
Такой вот табутаск.


begin...end   (2005-06-01 14:38:00) [9]

> a80h19 ©   (01.06.05 14:31) [8]

Есть p-- экземпляр класса А. В нём два одноимённых поля -- собственное и унаследованное от Г.

Чтобы получить значение собственного поля p, пишем p.Figura.
Чтобы получить значение унаследованного поля p, пишем Г(p).Figura.

Только сначала значение нужно туда записать. Значение поля в экземпляре класса-потомка от присвоения значения полю экземпляра класса-предка само не появится.


a80h19   (2005-06-01 14:31:00) [10]


> В смысле, одно поле -- унаследованное от Г, а второе --
> собственное.

Уже оценил глубину своего позора.
Как сотворить, чтобы в Г(p).Figura все же типа "полиморфно" получалось значение из потомка?


a80h19   (2005-06-01 14:28:00) [11]


>Просто Джо ©   (01.06.05 13:51) [2]
>Апельсинник

?


evvcom   (2005-06-01 14:07:00) [12]


> В А и Б эта переменная объявлена по новой с другими типами

В Г, А и Б - три независимых поля! Причем адрес в Г будет отличаться от А и Б однозначно, адреса переменных в А и Б могут совпасть, но не обязательно.


begin...end   (2005-06-01 13:56:00) [13]

> begin...end ©   (01.06.05 13:54) [3]

В смысле, одно поле -- унаследованное от Г, а второе -- собственное.


Tesla   (2005-06-01 13:55:00) [14]

Полиморфизма для переменных не существует - только для функций.


begin...end   (2005-06-01 13:54:00) [15]

> a80h19 ©   (01.06.05 13:42)

> В Г объявлена переменная Figura некоего типа

> В А и Б эта переменная объявлена по новой с другими типами

В А и Б будет два независимых поля Figura.


Просто Джо   (2005-06-01 13:51:00) [16]

Апельсинник


Digitman   (2005-06-01 13:50:00) [17]


> Г(p).Figura должен содержать значение потомка


с какого перепугу ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо