我对许多其他线程中的Assign代码感到困惑,例如,这个: See the Assign method implementation given in an answer
procedure TDispPitch.Assign(Source: TPersistent);
var
LSource: TDispPitch;
begin
if Source is TDispPitch then
begin
LSource := TDispPitch(Source);
iLineSize := LSource.LineSize;
iLineColor := LSource.LineColor;
bDisplayAccent := LSource.DisplayAccent;
bVisible := LSource.Visible;
Changed;
end else
inherited;
end;
但是如果对继承的调用是在Else部分,那么如何为满足if条件的对象分配基类属性?将此与VCL自己的TStringList代码进行比较。
procedure TStringList.Assign(Source: TPersistent);
begin
inherited Assign(Source);
if Source is TStringList then
begin
FCaseSensitive := TStringList(Source).FCaseSensitive;
...
end;
end;
这首先正确调用Inherited,以便首先分配基类属性。
第一个代码块是对的吗?我在堆栈溢出的许多地方找到了这样的代码。我无法理解如何在该代码中分配基类属性。谁能解释一下?另一方面,如果代码错误,为什么没有人在所有这些线程中指出它?
答案 0 :(得分:0)
最后我开始解决这个问题。实际上,当我在TCollection上实现Sort时,它没有工作,最后我能够看到错误以及它应该如何工作。我不得不查看旧Delphi XE4版本中的来源以确认我的发现。
以下是编写重写的Assign代码时需要考虑的重点:
让我们尝试总结一下我们从使用TCollectionItem和TCollection / TOwnedCollection的角度学到的东西:
分配具有祖先TOwnedCollection / TCollection的类:使用顶部的第二个示例代码块,以便集合可以在您的之前进行分配。
分配具有祖先TCollectionItem / TPersistent的类:使用顶部的第一个示例代码块,因为这两个代码块都没有自己的Assigns。但是,如果从基于这些的另一个类派生并且它具有自己的Assign逻辑,则必须使用第二个示例,以便通过调用Inherited来首先执行其Assign。