怎样调用包含自身的类的属性? ( 积分: 100 )

  • 主题发起人 主题发起人 烈风
  • 开始时间 开始时间

烈风

Unregistered / Unconfirmed
GUEST, unregistred user!
创建一个测试类TTest
TTest = Class
Function GetStr:String;
End;
创建另一个类TParent
TParent = Class
TestStr: String;
End;
从这个类创建两个子类:TChild1,TChild2
TChild1 = Class(TParent)
Test: TTest;
End;
TChild2 = Class(TParent)
Test: TTest;
End;

Var
Child1, Child2: TParent;
Begin
Child1 := TChild1.Create;
Child1.TestStr := '一';
Child1.Test := TTest.Create;
Child2 := TChild2.Create;
Child2.TestStr := '二';
Child2.Test := TTest.Create;
End;
我想调用 Child1.Test 的 GetStr 函数时返回“一”,调用 Child2.Test 的 GetStr 函数时返回“二”,在 TTest 类中应该怎样写这个函数?
 
创建一个测试类TTest
TTest = Class
Function GetStr:String;
End;
创建另一个类TParent
TParent = Class
TestStr: String;
End;
从这个类创建两个子类:TChild1,TChild2
TChild1 = Class(TParent)
Test: TTest;
End;
TChild2 = Class(TParent)
Test: TTest;
End;

Var
Child1, Child2: TParent;
Begin
Child1 := TChild1.Create;
Child1.TestStr := '一';
Child1.Test := TTest.Create;
Child2 := TChild2.Create;
Child2.TestStr := '二';
Child2.Test := TTest.Create;
End;
我想调用 Child1.Test 的 GetStr 函数时返回“一”,调用 Child2.Test 的 GetStr 函数时返回“二”,在 TTest 类中应该怎样写这个函数?
 
TParent = class;
TTest = Class
FParent: TParent;
Function GetStr:String;
End;

TParent = Class
TestStr: String;
End;

TChild1 = Class(TParent)
Test: TTest;
End;

TChild2 = Class(TParent)
Test: TTest;
End;

implementation

{ TTest }

function TTest.GetStr: String;
begin
if FParent = nil then Exit;
Result := FParent.TestStr;
end;
//测试
Var
Child1, Child2: TParent;
Begin
Child1 := TChild1.Create;
Child2 := TChild2.Create;
try
Child1.TestStr := '一';
TChild1(Child1).Test := TTest.Create;
TChild1(Child1).Test.FParent := Child1;
TChild2(Child2).TestStr := '二';
TChild2(Child2).Test := TTest.Create;
TChild1(Child2).Test.FParent := Child2;
Edit1.Text := TChild1(Child1).Test.GetStr;
Edit2.Text := TChild2(Child2).Test.GetStr;
finally
TChild1(Child1).Test.Free;
TChild2(Child2).Test.Free

Child1.Free;
Child2.Free;
end;
 
但还是得用 TChild1(Child1).Test.FParent := Child1
这样的语句来指定 FParent 具体是哪一个类实例,我想做的是能把 TTest 封装起来,不管 TTest 的实例被包含在哪一个类实例中,只要这个类实例有 TestStr 属性就能返回它的值。
 
要调用函数,必须有对象的参考.这就意味着必须有一种查找Parent的方法。而在Delphi中默认是没有这种机制的。因此必要的赋值是必需的。
不过在调用获得属性的时候,既可以类型化调用属性,也可以利用RTTI获得属性的值。如果需要的话,有很多资料可以参考
 
RTTI是什么?
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
913
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部