Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.049 c
3-1116485459
Prohodil Mimo
2005-05-19 10:50
2005.06.29
SQL: выбор полей из таблицы + значения возвращённые процедурой.


1-1118108863
paule
2005-06-07 05:47
2005.06.29
Передача указателя формы в процедуру dll


1-1117885913
heady
2005-06-04 15:51
2005.06.29
программа, вечно висящая в трее


1-1118091583
Karnak
2005-06-07 00:59
2005.06.29
Путь папки windows


1-1117631953
Ega23
2005-06-01 17:19
2005.06.29
Абсолютное значение времени





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский