Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопрос по RTTI


Страницы:   1 2

sirin ©   (2007-04-18 13:53:00) 

Есть 2 класса


type
 A = class(TPersistent)
 private
   FProp: string;
   function GetProp: string;
   procedure SetProp(const Value: string);
 published
   property prop: string read GetProp write SetProp;
 end;

type
 AB = class(A)
 private
   FProp: string;
   function GetProp: string;
   procedure SetProp(const Value: string);
 published
   property prop: string read GetProp write SetProp;
 end;

function A.GetProp: string;
begin
 result := FProp;
end;

procedure A.SetProp(const Value: string);
begin
 ShowMessage('A');
 FProp := Value;
end;

{ AB }

function AB.GetProp: string;
begin
 result := inherited GetProp;
end;

procedure AB.SetProp(const Value: string);
begin
 ShowMessage('AB');
 inherited SetProp(Value);
end;



Как видно из кода, один класс наследует другой, в первом обьявлено свойство prop, в другом оно перекрыто.

Есть метод, который использует эти классы



procedure TForm1.Button1Click(Sender: TObject);
var
 ObjA: A;
 ObjAB: AB;
begin
 ObjA := A.Create;
 ObjAB := AB.Create;

 SetPropValue(A(ObjAB), 'prop', 'test');

 ObjA.Free;
 ObjAB.Free;
end;


Так вот, несмотря на то, что в параметре я привел обьект класса AB к классу A, при установке свойства у меня все равно срабатывает сеттер класса AB.
Если я устанавливаю свойство обычным способом - A(ObjAB).prop := 'test'; срабатывает сеттер только класса A что мне и нужно.
В чем здесь проблема?


sirin   (2007-04-18 14:21:00) [21]

SetPropValue(A(ObjAB), 'prop', 'test');


oxffff   (2007-04-18 14:19:00) [22]

А где здесь RTTI?


Сергей М.   (2007-04-18 14:13:00) [23]


> Он просто не понимает, что я привожу обьект к другому классу


И не поймет, пока тыне поймешь принципы полиморфизма в ООП)


sirin   (2007-04-18 14:09:00) [24]


procedure AB.SetProp(const Value: string);
begin
 ShowMessage('AB');
 inherited SetProp(Value);
end;


Если я делаю
ObjA.prop := 'test';
то получаю сначала ShowMessage('AB') (сработал сетер класса AB) потом ShowMessage('A') (сработал сетер класса A)

Если я делаю
A(ObjA).prop := 'test';
то получаю только ShowMessage('A') (сработал сетер класса A) - что правильно, потому что я привел обьект к классу A

но такое приведение не работает в SetPropValue =(
Он просто не понимает, что я привожу обьект к другому классу =(


Сергей М.   (2007-04-18 14:03:00) [25]


> в другом оно перекрыто.


"перекрыто" - это override, при условии что перекрываемый метод объявлен как virtual.

У тебя же ни тем ни другим даже не пахнет.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо