Delphi 如何使已弃用的接口函数停止显示编译器警告?

Delphi 如何使已弃用的接口函数停止显示编译器警告?,delphi,interface,deprecated,delphi-10-seattle,Delphi,Interface,Deprecated,Delphi 10 Seattle,我有一个接口,和一个相应的接口对象。在这些函数中,我在接口和接口对象中将其中一个函数标记为已弃用: type ISomeInterface = interface function SomeFunctionName: String; deprecated; end; TSomeInterface = class(TInterfacedObject, ISomeInterface) function SomeFunctionName: String; deprecat

我有一个接口,和一个相应的接口对象。在这些函数中,我在接口和接口对象中将其中一个函数标记为
已弃用

type
  ISomeInterface = interface
    function SomeFunctionName: String; deprecated;
  end;

  TSomeInterface = class(TInterfacedObject, ISomeInterface)
    function SomeFunctionName: String; deprecated;
  end;
但是,在编译时,我收到一个编译器警告:

不推荐使用符号“SomeFunctionName”

这来自接口对象的定义,其中表示
TSomeInterface=class(…
)。如果我从接口对象中删除
deprecated
,警告将消失。但我仍然希望在该函数上标记此警告


我需要做什么才能停止此编译器警告,同时仍将其标记为“已弃用”?我应该只在接口上标记它,而不是同时在两者上标记它吗?或者是否有方法指示编译器不要发出警告?

似乎存在编译器错误(或至少定义奇怪的行为).然而,我认为你可以实现你想要的,而不会遇到那个问题

编译器的问题似乎是,同时具有接口方法和该方法的实现标记为
已弃用
会导致弃用警告,即使该接口方法从未实际使用过

但您不需要同时标记这两个

将您的接口方法标记为已弃用,并保留该方法的实现未标记。我还强烈建议您将您的接口方法设置为私有或至少受保护,以避免通过对象引用访问它们

方法的实现满足必须实现接口的约定。因此,接口上方法的弃用状态仅对通过该接口使用该方法的任何代码重要

只有当代码通过接口引用引用了不推荐使用的方法时,才会收到警告:

type
  ISomeInterface = interface
    function SomeFunctionName: String; deprecated;
    procedure OtherProc;
  end;

  TSomeInterface = class(TInterfacedObject, ISomeInterface)
  private // ISomeInterface
    function SomeFunctionName: String;
    procedure OtherProc;
  end;


// ..

var
  foo: ISomeInterface;
begin
  foo := TSomeInterface.Create;
  foo.SomeFunctionName;  // Will emit the deprecated warning
  foo.OtherProc;        // Will emit no warning
end;

即使你的项目不调用函数,你也能得到警告吗?“约翰,确切地说,只是在接口对象中单独定义它。但是这就是接口的全部要点,没有实现就毫无意义。我个人认为,这是一个编译器错误,或者一般来说,有些东西被忽略了。我应该能够把它标记为<代码> DeCract。ed在两个地方都没有警告。“或者有没有办法指示编译器不要发出警告?”也许不是你想要的答案,但是使用{$WARNINGS OFF}和{$WARNINGS ON}会有用吗?@Jerry:如果类只是接口的实现,而不是单独使用的话(即,您永远不会直接在类实例上调用该方法,只能通过接口间接调用),没有必要像Deltics已经说过的那样将类的方法标记为已弃用。@Rudy这在某些情况下可能是正确的,但在我的情况下,开发人员可以选择。类似于Delphi中的XML库。您可以创建
TXmlDocument
组件(对象),或改用
IXmlDocument
。在我的情况下,情况基本相同。仅仅因为我有一个接口,并不意味着我自动拒绝使用对象的选项:-)