(在线等)请问怎么写递归的抽象类(关于类的继承和多态性的实现)? ( 积分: 100 )

  • 主题发起人 冰冷的雨
  • 开始时间

冰冷的雨

Unregistered / Unconfirmed
GUEST, unregistred user!
有两个类如下:
(1)
TCustomLanNode = class(TObject)
private
FParent: TCustomLanNode;
FBrother: TCustomLanNode;
......
end.
(2)
TMyNode = class(TCustomNode)
在(2)中的FParent和FBrother应该是TMyNode,而不再是TCustomNode。
请问该如何写这两个类?
另外,我在(1)(2)里都要重载Create,是否在两个类的定义里都要用
constructor Create(AOwner: TComponent)
override;
或者(1)里用constructor Create(AOwner: TComponent);virtual

(2)里用constructor Create(AOwner: TComponent)
override;
 

冰冷的雨

Unregistered / Unconfirmed
GUEST, unregistred user!
有两个类如下:
(1)
TCustomLanNode = class(TObject)
private
FParent: TCustomLanNode;
FBrother: TCustomLanNode;
......
end.
(2)
TMyNode = class(TCustomNode)
在(2)中的FParent和FBrother应该是TMyNode,而不再是TCustomNode。
请问该如何写这两个类?
另外,我在(1)(2)里都要重载Create,是否在两个类的定义里都要用
constructor Create(AOwner: TComponent)
override;
或者(1)里用constructor Create(AOwner: TComponent);virtual

(2)里用constructor Create(AOwner: TComponent)
override;
 

暗月

Unregistered / Unconfirmed
GUEST, unregistred user!
1. 子类能访问到父类的private属性并不是一个好的设计。
2. 子类的属性是可以仅仅是父类属性的一个包装,例如:

TCustomNode = class
...
property Parent: TCustomNode;
...
end;

TMyNode = class (TCustomNode)
...
function GetParent: TMyNode
{result := TMyNode(inherited Parent);}
procedure SetParent(const Value: TMyNode)
{inherited Parent := Value;}
...
property Parent: TMyNode read GetParent write SetParent;
...
end;
 

仙剑奇侠

Unregistered / Unconfirmed
GUEST, unregistred user!
(2)中可以直接定义
TMyNode = class(TCustomNode)
FParent: TMyNode;
FBrother: TMyNode;
......
end;
 

冰冷的雨

Unregistered / Unconfirmed
GUEST, unregistred user!
TO暗月:
1、private是笔误,从代码中COPY过来的时候删错了(呵呵,太菜了);
2、procedure SetParent(const Value: TMyNode)
{inherited Parent := Value;}
为什么要用inherited?

TO仙剑奇侠:
这样的话(1)中的
FParent: TCustomLanNode;
FBrother: TCustomLanNode;
不是没用了?
我想定义一个网络节点类TLanNode,由于网络节点有服务器、路由器、交换机、工作站等,
它们的属性和方法都不完全一样,所以抽象出TCustomLanNode。方法的多态容易实现,可
属性呢?
 
C

creation-zy

Unregistered / Unconfirmed
GUEST, unregistred user!
对于这种树型结构,在祖先类中声明了的子节点不需要在子节点中重新声明。如果类型已
经被扩展,只要在使用的时候强制转换一下即可,没有任何问题。良好的设计是可扩展的,
即然已经在祖先类中声明了基类域,在子类中就可以将该域赋值为基类对象或者子类对象。
正如TComponent的Components属性——它认为所有的子对象都是TComponent的子类型,我们
在使用的时候用 is 运算符判断它的子类型后就可以进行强制转换并调用该子类型的特定方
法了。
 
W

wzl1027

Unregistered / Unconfirmed
GUEST, unregistred user!
只要
FParent: TCustomLanNode;
发布出来就该可以了吧
因为他们是继承关系的
 
W

webwalker

Unregistered / Unconfirmed
GUEST, unregistred user!
由于网络节点有服务器、路由器、交换机、工作站等,
它们的属性和方法都不完全一样
----------------------------------
我想先找到他们共有的属性和方法抽出来作为基类在此基础上在逐层扩展,层数不要太多,
<=4层最好,另外你的类写在一个单元的的话就无所谓私有不私有了。
 

冰冷的雨

Unregistered / Unconfirmed
GUEST, unregistred user!
有点明白了,谢谢
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
459
import
I
I
回复
0
查看
695
import
I
顶部