delphi 如何将属性标记为已弃用?

Posted

技术标签:

【中文标题】delphi 如何将属性标记为已弃用?【英文标题】:How can I mark a property as deprecated in delphi? 【发布时间】:2012-03-18 23:39:55 【问题描述】:

我想在 Delphi 中将一个属性标记为已弃用,以便以后删除。根据 Delphi 文档 deprecated 可以附加到任何声明,但它不适用于属性。有没有办法做到这一点?

这是我尝试过的:

property SomeProp: string
  read   FSomeProp
  write  SetSomeProp; deprecated 'Use SomeOtherProp instead';

【问题讨论】:

顺便说一句,如果它被支持,我认为分号就不会存在(参见所有支持的案例)。 另外一个有趣的问题是:如果该字段已被弃用 (FValue: Integer deprecated;),它可以被属性使用而不会产生警告:例如property Value: Integer read FValue write FValue; 我知道这是旧的,答案都在这里,但 FWIW。如果您只使用过此属性的读取或写入方面,那么您可以删除该属性并添加一个名为“SomeProp”的函数或过程来替换它。然后可以将新的 func/proc 标记为已弃用。 另外,当你想弃用一个类方法时需要分号,但当你想弃用记录字段时必须省略分号。我的意思是,谁还需要一致性? 【参考方案1】:

不,这是不可能的。根据the documentation,

“提示”指令 platformdeprecatedlibrary 可能是 附加到任何声明。这些指令将在 编译时间。提示指令可以应用于类型声明, 变量声明、类、接口和结构声明, 类或记录、过程、函数和 方法声明和单元声明。

【讨论】:

该死的,我怕是这样。我不认为有一个很好的解决方法? @Tellmor:我的第一个想法是您可以将 setter(如果有的话;在本例中为 SetSomeProp)标记为已弃用。 不幸的是,当使用该属性时,这不会生成编译器提示。 有一份 Embarcadero QC 报告,以防有人想投票支持它! qc.embarcadero.com/wc/qcmain.aspx?d=96350 请注意QualityCentral has now been shut down,因此您无法再访问qc.embarcadero.com 链接。如果您需要访问旧的 QC 数据,请查看 QCScraper。【参考方案2】:

您不能这样做,但是您可以在属性 setter/getter 中编写已弃用的代码!

所以在你的情况下,你应该像这样创建一个 SetSomeProp 设置器:

Type
    TYourClass = class
    private
      procedure DummyDepricated; deprecated 'Use SomeOtherProp instead';
      procedure SetSomeProp(const AValue: string); 
    published
      property SomeProp: string read   FSomeProp write  SetSomeProp; 

    implementation

    procedure TYourClass.SetSomeProp(const AValue: string); 
    begin
      DummyDepricated;
      //the old setter code here
    end;

    procedure TYourClass.DummyDepricated;
    begin
      //this is dummy
    end;

【讨论】:

我认为这没有帮助。这样做是在编译实现 TYourClass 的单元时生成使用 DummyDetricated 的警告。但这不会警告是否有任何消费者正在使用即将在该单元之外删除的属性。 实际上这会显示“Use SomeOtherProp instead” 是的,但是会出现警告,因为您自己正在使用已弃用的程序。使用即将被删除的属性不会有额外的警告 - 这是这个问题的重点。 我知道,这就是为什么我一开始就写“你不能那样做”的原因,我没有回答这个问题,我也无法在评​​论中写下我的解决方案,因为它包含一些用于评论的大代码,这就是为什么我将其添加为答案的原因,我的想法只是首先给出一个可能有助于解决这个问题的解决方案,而不是给出答案......【参考方案3】:

如果您的属性是只读的,那么您可以使用一个简单的解决方法。

代码将从这里开始:

property SomeProp: string read FSomeProp; deprecated 'Use SomeOtherProp instead';

到这里:

function SomeProp: string; deprecated 'Use SomeOtherProp instead';

如果是我,我会走:

function SomeProp: string; deprecated 'Use SomeOtherProp instead';
procedure SetSomeProp(Value: string); deprecated 'Call SomeOtherProp := Value instead';

【讨论】:

以上是关于delphi 如何将属性标记为已弃用?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 RAML 中将 REST 服务标记为已弃用

将 PLSQL 过程/函数标记为已弃用

将 pybind11 绑定标记为已弃用的最佳方法

重命名python子包,将旧名称标记为已弃用

是否可以在打字稿中将某些内容标记为已弃用?

如何将方法标记为过时或弃用?