如何在Delphi中将属性标记为已弃用?

33

我想在Delphi中将某个属性标记为已弃用以便稍后移除。根据Delphi文档,deprecated可以添加到任何声明中,但对于属性似乎不起作用。有没有一种方法可以做到这一点?

以下是我尝试过的:

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

顺便说一句,如果被支持的话,我认为分号就不会出现了(参考所有被支持的情况)。 - Andreas Rejbrand
2
另一个有趣的事情是:如果该字段已被弃用(FValue: Integer deprecated;),则可以通过属性使用它而_不会_生成警告:例如,property Value: Integer read FValue write FValue; <--没有警告!!(至少在D2007中)。 - Disillusioned
我知道这已经很老了,而且答案都在这里,但是FWIW。如果您只使用此属性的读取或写入方面,则可以删除该属性并添加名为“SomeProp”的函数或过程来替换它。然后,可以将新的func / proc标记为不推荐使用。 - Tony
另外一件事,当您想弃用类方法时,必须使用分号,但当您想弃用记录字段时,则必须省略分号。我的意思是,谁需要一致性呢? - JensG
3个回答

30
不,这是不可能的。根据文档
引用: “提示”指令平台弃用可以附加到任何声明中。这些指令将在编译时产生警告。提示指令可应用于类型声明、变量声明、类、接口和结构声明、类或记录中的字段声明、过程、函数和方法声明以及单元声明。

该死,我就怕会出现这种情况。我想没有好的解决方法了吧? - Trellmor
3
我的第一个想法是,如果有setter(在这种情况下为SetSomeProp),你可以将其标记为“不推荐使用”。 - Andreas Rejbrand
3
很遗憾,当属性被使用时,这并不会生成编译器提示。 - Trellmor
9
如果有人想要投票支持,这里有一个Embarcadero QC报告! http://qc.embarcadero.com/wc/qcmain.aspx?d=96350 - Sean Ferris
1
请注意,QualityCentral现已关闭,因此您无法再访问qc.embarcadero.com链接。如果您需要访问旧的QC数据,请查看QCScraper - Remy Lebeau

2

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

因此,在你的情况下,你应该创建一个像这样的SetSomeProp setter:

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单元时生成警告,表明使用了DummyDepricated。但是,如果任何消费者在该单元之外使用即将被删除的属性,则不会发出警告。 - nil
实际上这将显示“请使用SomeOtherProp代替” - ZORRO_BLANCO
是的,但警告会出现,因为您自己正在使用已弃用的过程。对于使用即将被删除的属性不会有额外的警告 - 这就是这个问题的重点。 - nil
我知道,这就是为什么我在开头写了“你不能这样做”,我没有回答问题,而且我无法在评论中编写我的解决方案,因为它包含了一些比较长的代码,这就是为什么我将其添加为答案的原因。我的想法只是提供一个可能有助于此问题的解决方案,而不是直接回答问题... - ZORRO_BLANCO

1
如果您的属性是只读的,那么您可以使用一个简单的解决方法。
代码将从这个变成:
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';

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