Главная страница
    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.49 MB
Время: 0.041 c
1-1117806282
fagot
2005-06-03 17:44
2005.06.29
Побудка


1-1118208961
Mefodiy
2005-06-08 09:36
2005.06.29
Число строк в документе Word


9-1111330545
MrAngel
2005-03-20 17:55
2005.06.29
Полноэкранный режим в Direct3D


1-1117699906
Gek1
2005-06-02 12:11
2005.06.29
Еще раз потоки


14-1117700572
Keasha
2005-06-02 12:22
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский