我可以创建与自身类型相同的对象吗?

时间:2009-11-21 16:38:30

标签: delphi

我有一个类,我们称之为TMyObject,它应该返回一个稍微修改过的自身副本。 因此,它的一个函数应该返回一个与它自身相同类型的对象:

function TMyObject.TrimEnds: TMyObject;
begin
  Result:= TMyObject.Create;
  Result.DoStuff;
edn;

我能这样做吗?我在做什么才合法?

我的意思是,我已经尝试过了,编译器允许我这样做,但我想知道是否会有很长时间/隐藏的负面影响。

任何想法都将不胜感激。 谢谢。


编辑: 新略微修改的副本将保存到磁盘。这是某种“拯救......”。 工作原理:原始对象创建自身的副本,指示此副本进行一些更改并保存到磁盘。然后原来释放副本。这样我就可以保持原始对象在内存中保持不变,但我将其修改为磁盘版本。

您可能认为我的对象有图片。我需要的是一个函数,它返回一个稍微修改过的图片副本。

5 个答案:

答案 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)

你所写的内容绝对没有错。你只是返回一个对象,这是完全有效的,它可以是任何其他类型的任何其他对象。