Главная страница
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.03 c
4-1115404206
Switer
2005-05-06 22:30
2005.06.29
Блокировка клавиш


1-1118169137
Ralf
2005-06-07 22:32
2005.06.29
Form


14-1117290488
Ломброзо
2005-05-28 18:28
2005.06.29
Как подписаться на буржуйскую группу новостей?


6-1111118939
TankMan
2005-03-18 07:08
2005.06.29
Хотелось бы узнать алгоритм поиска компьютеров в сети...


4-1115483450
Galiaf
2005-05-07 20:30
2005.06.29
Как сделать так чтобы при запуске проги появлялась иконка в трее?