![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Полиморфизм для переменной [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 должен содержать значение потомка
с какого перепугу ?