【问题标题】:Is it possible to have the read/write of a property to have different visibility?是否可以让属性的读/写具有不同的可见性?
【发布时间】:2011-04-01 15:27:16
【问题描述】:

正如问题所说...是否可以在不同的可见性级别声明属性的读/写。如果是这样,语法是什么?

类似的东西:

  protected
    property MyProp : Integer write FMyProp;
  public
    property MyProp : Integer read FMyProp;
  end;

并不是说它会是一个主要的语言特性,它很容易被替换为

protected
  procedure SetMyProp(Value : Integer);
public
  property MyProp : Integer read FMyProp;
end;

我只是好奇这种可能性是否存在。

【问题讨论】:

  • 如果你想要这样,那么只需使用私有或受保护的 Set 方法 (SetPropName),而不是将其放在公共或发布的属性中。您必须使用 object.SetPropName(x) 而不是 object.PropName := x,这很好。
  • 作为旁注,如果你使用 interfaces 这样的结构自然而然。在界面中,该属性将是只读的。在课堂上,它将被读/写和保护。

标签: delphi language-features


【解决方案1】:

不,您必须将其拆分为两个单独的属性(具有不同的名称),尽管它们可以引用同一个私有字段。

【讨论】:

    【解决方案2】:

    不,这是不可能的。但是,我不确定您为什么需要这样做。

    我能看到的唯一原因是将其设为只读,同时仍允许在对象检查器中发布和查看它,您已经可以这样做了:

    private
      procedure SetMyProp(Value: String);
    published
      MyProp: string read FMyProp write SetMyProp;
    
    ...
    procedure TMyComponent.SetMyProp(Value: String);
    begin
      //
    end;
    

    【讨论】:

    • C# 自 2006 年左右的 c# 2 以来就具有非对称属性访问器。它们用于更好地强制执行成员可见性(Delphi 缺乏的一个领域,因为我们不能在 Delphi 中拥有真正的私有字段)。
    • @Cosmin:什么意思,我们在Delphi中不能有真正的私有字段?
    • 我知道。 :) 问题是关于德尔福的,鉴于原始问题中的示例,我不明白为什么需要它;这就是为什么我在回答中这么说的原因。如果唯一的目标是隐藏课堂之外的写作能力(例如,保护它),我的解决方案是有效的;在课堂内,你直接写给 FMyProp 而不是 MyProp。
    • @Cosmin Prund:strict private 不是真正私人的吗?
    • 这不仅是为了让事情顺利进行,而且是关于强制执行 OOP 概念并仅通过语言结构来记录它们。我提出 C# 是因为很多 Delphi 用户同时使用这两种语言,而且这个想法可能是借来的。关于您的想法,我只是跳过 setter 的声明以获得真正的只读属性。 OP 最初将该属性声明为 publi,我认为他不想发布。
    猜你喜欢
    • 2013-06-24
    • 1970-01-01
    • 2015-12-11
    • 2012-06-04
    • 2013-02-07
    • 2021-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多