仅当重写一对方法或属性中的一个时显示警告

HCL*_*HCL 9 c# compiler-warnings

我有ac#-class,它提供虚拟操作.对于每个操作都存在同步和异步版本.

public class Foo{
   public virtual void Bar(){..};
   public virtual Task BarAsync(){..};

   ...
}
Run Code Online (Sandbox Code Playgroud)

如果只覆盖一个版本的操作(操作的同步版本或异步版本),编译器会显示警告,例如编译器在Equals没有覆盖时覆盖,GetHashCode或者反之亦然时会发出警告.

更广泛地质疑:是否可以强制覆盖一个方法或属性强制覆盖其他属性或方法(通过编译器警告).

Him*_*ere 3

虽然这不是您实际问题的答案,但我\xc2\xb4m 要求一种您甚至不需要警告的方法。

\n\n

为什么不创建一个具有可重写成员的抽象类和一个不带以下内容的密封类:

\n\n
public class Foo{\n   public virtual void Bar(){..}\n   public virtual Task BarAsync(){..}\n}\n\npublic abstract class ImplementIt : Foo {\n   public abstract override void Bar();\n   public abstract override Task BarAsync();\n}\npublic sealed class DoNotImplementIt : Foo {\n   public override void Bar() {..}\n   public override Task BarAsync() {..}\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

Foo现在,客户可以设计是否需要默认行为 (= )的实现DoNotImplementIt,或者是否需要使用ImplementIt. 在前一种情况下,他被迫凌驾于后一种情况下的成员之上。

\n\n

这种方法对于 API 用户来说要干净得多,因为他知道要从继承链中重写什么,而不是依赖于实际上没有人关心的混乱警告。

\n\n

更好的方法是定义Foo一个既可以实现ImplementItDoNotImplementIt可以实现的接口(听起来很奇怪,但是你明白了)。使您免遭此祸abstract overrideinternal通过这种方式,您还可以通过 make和仅 make 使实现类可从 API 访问来从外部隐藏您的接口。

\n