高手,请指教一二(对象属性的问题,加急!)(50分)

  • 主题发起人 finallover
  • 开始时间
F

finallover

Unregistered / Unconfirmed
GUEST, unregistred user!
我们极力主张使用面向对象的思想,但是做的时候遇到一下问题:
例如:
自定义一个类,它的属性里有一个对象.
MyType = class(TObject)
FObj:MyType1;//这个类在别处定义
Property Obj:MyType1 read GetObj write SetObj;
end;
function GetObj():MyType1;
begin
//如果我这么写,会怎么样?
result := FObj;
//我们实际的写法是这样的,可行吗?
if FObj = nil then
result :=FetchObj();//这是一个包含其它步骤生成一个新的MyType1类型对象
else
result := FObj;
end;
procedure SetObj(Value:MyType1);
begin
//如果我这么写,可以吗?
FOjb := Value;
//那怎么做是比较好的和安全的呢?
end;
 
可以,我任务没有什么问题。
或者可以把代码贴出来。
 
FOjb := Value;
是把FObj指向Value的引用,但是这样,它原来引用的那个对象不是就被漏掉了吗?
 
在读函数中不要生成新的对象,如果生成的话就有你所说的问题了。
 
通常是 FObj.Assign(Value);
 
回lichaogang:我提供的方法就是想查数据库,返回一个新的对象的,如果不生成新的对象,我那个新对象从哪里来?
 
你的想法不对,比如说datasource的dataset属性,如果你不赋值它还会生成一个新的dataset给你?
 
属性是类类型的话,用不着Get...,Set...
 
to zhukewen:那该怎么做哈?
 
MyType = class(TObject)
FObj:MyType1;//这个类在别处定义
Property Obj:MyType1 read FObj;
end;
 
if FObj = nil then
result :=FetchObj();//这是一个包含其它步骤生成一个新的MyType1类型对象
else
result := FObj;
end;
上面一段有问题:result :=FetchObj();//很可能产生会内存泄漏!除非你在FetchObj()内部将对象赋值给FObj。因此建议:
if FObj = nil then
beign
FObj:=FetchObj();
end;
result := FObj;
//----------------------------------------------------
procedure SetObj(Value:MyType1);
begin
//如果我这么写,可以吗?
FOjb := Value;//这里也会产生内存泄漏!!!!!!!!!!
//那怎么做是比较好的和安全的呢?
end;
应该像下面更合适一些:
procedure SetObj(Value:MyType1);
begin
if FObj <> nil then FObj.Free;
FOjb := Value;
end;
 
多人接受答案了。
 
顶部