gpt4 book ai didi

c# - 当仅覆盖一对方法或属性中的一个时显示警告

转载 作者:太空狗 更新时间:2023-10-29 17:55:58 25 4
gpt4 key购买 nike

我有一个提供虚拟操作的 c# 类。每个操作都存在同步和异步版本。

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

...
}

如果只有一个版本的操作被覆盖(操作的同步或异步版本),我想让编译器显示警告,例如编译器在覆盖 Equals 而没有覆盖 GetHashCode,反之亦然。

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

最佳答案

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

为什么不创建一个具有可覆盖成员的抽象类和一个没有以下成员的密封类:

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

public abstract class ImplementIt : Foo {
public abstract override void Bar();
public abstract override Task BarAsync();
}
public sealed class DoNotImplementIt : Foo {
public override void Bar() {..}
public override Task BarAsync() {..}
}

现在客户可以设计是否需要 Foo 的实现你的默认行为 (= DoNotImplementIt ) 或者如果他需要使用 ImplementIt 的可定制版本.在前一种情况下,他被迫覆盖后一种情况下的成员。

这种方法对您的 API 用户来说要干净得多,因为他知道要从继承链中覆盖什么,而不是依赖于杂乱无章的警告,而这些警告甚至没有人真正关心过。

更好的方法是定义 Foo作为一个接口(interface),ImplementItDoNotImplementIt实现(听起来很奇怪,但是你明白了)。将您从这个 abstract override 中拯救出来.通过这种方式,您还可以通过将其设置为 internal 来从外部隐藏您的界面。并且仅使实现类可从 API 访问。

关于c# - 当仅覆盖一对方法或属性中的一个时显示警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37523943/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com