如何让IDE知道我使用了祖先变量?

3

为了简化,我只有两个类TParentTChild

TParent = class
protected
  FValue : Integer;
end;

TChild = class(TParent)
public
  property Value : Integer read FValue;
end;

如果TChild属性的Value使用了另一个单元中的TParent变量FValue,当使用自动完成时,IDE将始终创建新的变量,这样在添加新属性或方法时可能会导致意外错误,并且这是个问题。
TChild = class(TParent)
private
  FValue: Integer;
public
  property Value : Integer read FValue;
end;

然而,如果TParentTChild在同一个单元中,一切都正常。如果我没有将两个类移动到同一个单元的能力,有没有办法防止这种情况发生?另外,我也无法访问包含TParent的单元。在这种情况下,TChild是从TCustomGrid继承的组件。


通常解决问题的最佳方法是消除问题。一旦您消除了问题,就不需要再寻找解决方案。不要使用冲突的名称。 - David Heffernan
@DavidHeffernan 我不确定这会有什么帮助。我可以使用任何名称,但结果都将是相同的。 - Triber
1
@DavidHefferman - 从我的阅读来看,他并没有声明这个变量,他只是在访问它。如果在TParent类中将其定义为protected,则它对他是可用的,他所做的一切都是正确的... - Rob Lambden
哦,我以为你在创造这些重复的名称。我明白了。是的,看起来是IDE的问题。你只需要忍受它。 - David Heffernan
1个回答

2

这只是继承的本质,更具体地说,是字段可见性。简单的解决方案是引入一个可见性更高的属性获取函数。例如...

TParent = class
protected
  FValue : Integer;
public
  function GetValue: Integer;
end;

TChild = class(TParent)
public
  property Value : Integer read GetValue;
end;

...

function TParent.GetValue: Integer;
begin
  Result:= FValue;
end;

代码补全只是遵循这些相同的规则 - 它没有父级字段的可见性,因此它会生成一个新的。


正如我在 Delphi 中学到的不使用 getter,除非它们是必需的,我从未想过这个解决方案。虽然我无法访问 TParent,但我可以在 TChild 中实现相同的功能。 - Triber
@Triber "虽然我没有访问TParent的权限",但你在问题中没有说明这一点。如果TParent在另一个你无法访问的单元中,那就是完全不同的范围了。我假设你有访问权限,因为你提到它们在同一个单元中工作。 - Jerry Dodge
只要没有访问限制,我可以在TChild中创建一个getter函数来获取变量值,这样仍然是正确的答案。如果变量是受保护的,无论我在哪里创建getter,结果都是相同的。 - Triber
@Jerry Dodge - Getter函数不需要是public,除非你想直接调用它而不使用属性。一个受保护的getter就足够了,避免暴露类内部的太多细节。(我知道有些人对此非常激动!) - Rob Lambden
1
只需不使用IDE的自动完成功能,全部手动输入即可。或者在子级中删除私有字段,然后自动完成就不会再次添加它了! - R. Hoek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接