我有一个类,我们称之为TMyObject,它应该返回一个稍微修改过的自身副本。 因此,它的一个函数应该返回一个与它自身相同类型的对象:
function TMyObject.TrimEnds: TMyObject;
begin
Result:= TMyObject.Create;
Result.DoStuff;
edn;
我能这样做吗?我在做什么才合法?
我的意思是,我已经尝试过了,编译器允许我这样做,但我想知道是否会有很长时间/隐藏的负面影响。
任何想法都将不胜感激。 谢谢。
编辑: 新略微修改的副本将保存到磁盘。这是某种“拯救......”。 工作原理:原始对象创建自身的副本,指示此副本进行一些更改并保存到磁盘。然后原来释放副本。这样我就可以保持原始对象在内存中保持不变,但我将其修改为磁盘版本。
您可能认为我的对象有图片。我需要的是一个函数,它返回一个稍微修改过的图片副本。
答案 0 :(得分:5)
但我想知道是否会有很长时间 时间/隐藏的负面影响。
我没有看到任何,我曾经用我自己的链表做这件事,从来没有遇到任何问题。我认为这与在任何其他地方创建实例几乎相同。
答案 1 :(得分:2)
我猜你是对的,这段代码对我来说似乎不对。 您必须明确谁负责释放您返回的对象。 在大多数情况下,不会释放此对象。
更好的方法是通常让调用者创建对象,将其传递给您的方法(您只需要一个程序),然后修改它。
我很想知道您为什么要返回对象的“略微修改版本”。这听起来与我相反......
答案 2 :(得分:2)
正如其他人所说,这并没有错,但可能有更好的方法。
变式1:将其更改为类方法并为其指定一个有意义的名称。
class function TMyObject.CreateSpecialized: TMyObject;
begin
Result := TMyObject.Create;
//initialize Result
end;
anObj := TMyObject.CreateSpecialized;
变体2:使用构造函数。您可以在一个类中拥有多个构造函数。
constructor TMyObject.CreateSpecialized;
begin
Create; // make sure everything is initialized correctly
// now do custom initialization
end;
anObj := TMyObject.CreateSpecialized;
两个例子中的用法相同,但在第二种情况下,你的意图对随机读者来说更清楚。
如果要根据第一个对象的字段获取一个对象并创建另一个对象,请使用带参数的构造函数。
constructor TMyObject.CreateSpecialized(obj: TMyObject);
begin
Create;
intField := obj.IntField * 2;
end;
anObj := TMyObject.CreateSpecialized(otherObj);
答案 3 :(得分:2)
如果你有一个从TMyOtherObject = class(TMyObject)
这样的TMyObject派生的新类,那么TrimEnds函数仍然会返回一个TMyObject而不是TMyOtherObject。
您可以使用此方案解决此问题:
TMyObjectClass = class of TMyObject;
function TMyObject.TrimEnds: TMyObject;
begin
Result:= TMyObjectClass(ClassType).Create;
Result.DoStuff;
end;
答案 4 :(得分:1)
你所写的内容绝对没有错。你只是返回一个对象,这是完全有效的,它可以是任何其他类型的任何其他对象。