gpt4 book ai didi

c# - 防止方法被继承

转载 作者:太空狗 更新时间:2023-10-29 22:04:39 25 4
gpt4 key购买 nike

我有一个具体的基类 Foo,它包含 30 个与其子类相关的方法。

现在我遇到了一个只针对基类的情况,我想创建一个不能被继承的方法,这可以吗?

Class Foo 
{
/* ... inheritable methods ... */

/* non-inheritable method */
public bool FooSpecificMethod()
{
return true;
}
}

Class Bar : Foo
{
/* Bar specific methods */
}

var bar = new Bar();
bar.FooSpecificMethod(); /* is there any way to get this to throw compiler error */

编辑

我不确定我最初是否清楚。

我明白继承的原则,我明白里氏代换原则。在这种情况下,只有一个异常(exception)仅处理“未继承”的情况,因此我不想创建“uninheritedFoo”子类。

我问的是在技术上是否有可能创造一种情况foo.FooSpecificMethod() 是一种有效且可公开访问的方法,但子类 offoo.FooSpecificMethod() 会引发编译器错误。

本质上我想要一个未密封类的密封方法。

最佳答案

我会重新考虑这样做的必要性。

如果您使用继承,则表示“Bar”是“Foo”。如果“Bar”始终是“Foo”,则适用于“Foo”的方法也应该适用于“Bar”。

如果不是这种情况,我会将其重做为私有(private)方法。在公开场合,Bar 应该始终是 Foo。


只是为了更进一步-

如果你能做到这一点,事情就会变得非常复杂。您可能会遇到以下情况:

Foo myBar = new Bar(); // This is legal
myBar.FooSpecificMethod(); // What should this do?
// It's declared a Foo, but is acutally a Bar

不过,您实际上可以使用反射来强制执行此行为。我认为这是个坏主意,但 FooSpecificMethod() 可以检查它的类型,如果不是 typeof(Foo),则抛出异常。这会让人很困惑,而且气味很难闻。


根据问题的编辑进行编辑:

编译器无法强制执行您的要求。如果您真的想强制编译器检查并防止这种情况,您真的应该考虑将 Foo 设为密封类。在这种情况下,您可以使用子类化以外的其他扩展方法。

例如,您可能想考虑使用事件或委托(delegate)来扩展行为,而不是让对象成为子类。

尝试做你正在完成的事情基本上是在试图阻止继承的主要目标。

关于c# - 防止方法被继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/727996/

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