線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1226
推到 Plurk!
推到 Facebook!

封装问题 以及 复制子类 问题 思考良久.

尚未結案
zjscor
一般會員


發表:3
回覆:3
積分:1
註冊:2005-11-09

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-07-07 15:26:02 IP:218.6.xxx.xxx 訂閱
自己写的类,直接从OBJECT继承,
当一个类ListManager有一个TLIST链表属性DataList,用来存储数据的时候的情况.
该类有一个Buy(TObj);的方法来加入一个TOBJ的实例到FDATALIST
不过我是这么写的
FDataList.Add(Tobj);
也就是说加到FDataList里的实际只是该OTBJ实例的类引用.并不是把值复制给他.
而实际数据是存储在别的地方,比如其他地方A1.
访问这个类的该TLIST属性的时候.我是这么写的
Result:= FDataList;
这个实际上是返回的该类的私有成员FDATALIST里存在的TOBJ实例所在地址.
也就是说,编码者在这里通过调用该类的TLIST属性 可以直接修改A1里的对应的实例的数据.
总感觉这样好像不符合封装的基本原理

是不是需要把
FDataList.Add(Tobj);
改为:
FNewTobj:= Tobj.Create;
FNewTobj.Assgin(Tobj); (FNewTobj为该类里的一个TOBJ私有域) //这里加的时候可能是任意TOBJ的基类实例 把加入的类实例复制给一个新的TOBJ的私有类实例
FDataList.Add(Tobj);
这样应该可以创建新的数据,而防止操作ListManager类的时候修改到A1里原来的数据.
不过问题又出来了.因为TOBJ是一个虚拟基类
怎么判断加入的是他的哪个子类呢?
加入以后在读取DataList属性的时候读出来的实例的时候能否(DELPHI是用IS判断符)判断出DATALIST里的引用是哪个TOBJ的基类
的实例,或责都是判断成TOBJ的呢?
比如TOBJ.Check,而TOBJ的子类覆盖了OBJ.check
这个时候因为是使用的NewTobj:= Tobj.Create;所以调用ListManage的DATALIST属性访问到实例的CHECK应该是调用的TOBJ.CHECK....
难道真的要在FNewTobj:= Tobj.Create;这里加入
Case Obj Of
1: FNewTobj:= Tobj1.Create;
2: FNewTobj:= Tobj2.Create;
End;
来判断具体子类?
不知道可以不可以加的时候自动判断基类
取的时候 直接类引用就OK了
他自己判断
而不用写Case Obj Of
1: FNewTobj:= Tobj1.Create;
2: FNewTobj:= Tobj2.Create;
End;

但是如果数据太大太多,可能也不好

指针于类引用有多大区别呢.这里是TLIST 返回的是头指针吧. CONST应该只能限制指针地址不被改动

是不是可以使用CONST来限制类引用的修改呢.
不过既然试TLIST的属性,那是不是需要做一个有CONST限制的TLIST类的基类来实现

本来OBJECT有一个CLASSTYPE返回元类的,开始我想是否可以通过NewObj:= Obj.ClassType.Create来实现,不过后来发现不能
难道也不能通过类方法来实现嘛?


请教各位了.


至于第2个问题。
有朋友说可以这样解决
NewObj := aObj.ClassType.Create; //返回对象变量的正确类型,也就是你的子类,再CREATE

其实在我提问之前我就想到过的,查了一下TOBJECT 发现她返回的是一个原类 TCLASS
实际自己试了一下发现却不能编译通过。
是这么试的。
打开DELPHI ,随便新见一个项目,她自动会生成一个文件嘛
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var
Test:Tform1;
begin
Test:= form1.classtype.create; //这里编译的时候直接就出错了
//说的不能吧TOBJECT 赋值给TFORM。。。。
end;

我试过把TEST声明成TONJECT就可以通过。
不过按照字面理解: ClassType.Create; //返回对象变量的正确类型
她却返回的试TOBJECT。。。。。。。。。。。

不解了。。。还请大哥点明诀窍。。。到底试该怎么样才能正确的创建子类的实例
編輯記錄
taishyang 重新編輯於 2007-07-07 22:46:37, 註解 將文章分類成問題‧
zjscor
一般會員


發表:3
回覆:3
積分:1
註冊:2005-11-09

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-07-09 10:06:00 IP:222.212.xxx.xxx 訂閱
....虽然一直没人回答
不过还是谢谢大家了
问题我已经解决了。。。。1是设计问题
2 是使用元类
XXX.CLASSTYPE.CREATE 创建的时候其实已经是实际的类实例了
只需要强行转换一下类形态就可以了
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-07-09 17:42:25 IP:61.222.xxx.xxx 訂閱
沒辦法答覆。不清楚問什麼?
看的很累又有點亂,所以看不下去。.....

建議總結問題及大綱。
zjscor
一般會員


發表:3
回覆:3
積分:1
註冊:2005-11-09

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-07-13 00:37:11 IP:61.139.xxx.xxx 訂閱
SORRY
我下次注意。。。。。。。。。
系統時間:2024-05-02 22:26:03
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!