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