Форум: "Основная";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];
ВнизПолиморфизм для переменной Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.038 c