Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.06.29;
Скачать: CL | DM;

Вниз

Полиморфизм для переменной   Найти похожие ветки 

 
a80h19 ©   (2005-06-01 13:42) [0]

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

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


 
Digitman ©   (2005-06-01 13:50) [1]


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


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


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

Апельсинник


 
begin...end ©   (2005-06-01 13:54) [3]

> a80h19 ©   (01.06.05 13:42)

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

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

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


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

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


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

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

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


 
evvcom ©   (2005-06-01 14:07) [6]


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

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


 
a80h19 ©   (2005-06-01 14:28) [7]


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

?


 
a80h19 ©   (2005-06-01 14:31) [8]


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

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


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

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

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

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

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


 
a80h19 ©   (2005-06-01 14:41) [10]

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

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


 
a80h19 ©   (2005-06-01 14:42) [11]

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

 Г = 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;


 
Digitman ©   (2005-06-01 14:43) [12]

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

если св-ва 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:44) [13]

     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...


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


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


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


 
a80h19 ©   (2005-06-01 14:47) [15]


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

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


 
Digitman ©   (2005-06-01 14:50) [16]


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


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


 
a80h19 ©   (2005-06-01 14:54) [17]


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


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

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

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



Страницы: 1 вся ветка

Текущий архив: 2005.06.29;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.024 c
11-1099052914
Владимир Кладов
2004-10-29 16:28
2005.06.29
Версия 1.99


1-1117604631
leonidus
2005-06-01 09:43
2005.06.29
Подскажите компонент для отображения HTML страниц


1-1118081025
redlord
2005-06-06 22:03
2005.06.29
регулярные выражения


4-1114344510
Максим
2005-04-24 16:08
2005.06.29
USB on/off


11-1099285783
Cosim
2004-11-01 08:09
2005.06.29
Непечатные символы в RIchEdit-e