gpt4 book ai didi

c# - 为什么我可以抽象覆盖抽象方法?

转载 作者:可可西里 更新时间:2023-11-01 08:47:51 25 4
gpt4 key购买 nike

我有一个抽象基类:

abstract class Foo
{
virtual void DoSomeStuff()
{
//Do Some Stuff
}

abstract void DoSomeCrazyStuff();
}

还有另一个从中派生的抽象类:

abstract class Bar : Foo
{
abstract override void DoSomeStuff();

abstract override void DoSomeCrazyStuff();
}

我理解您为什么要抽象覆盖 DoSomeStuff() - 它需要为进一步的派生类重新实现。但我不明白为什么您要抽象覆盖 DoSomeCrazyStuff()。据我所知,它是多余的 - 我很确定删除它会产生零负面影响。

是否存在一些用例,其中抽象覆盖抽象会做一些有用的事情?如果不是,为什么没有编译器警告通知我我写的什么都不做?

最佳答案

Why can I abstract override an abstract method?

对于初学者来说,没有实际理由阻止它。如果它产生编译器错误,那么只会让类变得更脆弱。例如:

abstract class Foo
{
virtual void DoSomeStuff()
{
//Do Some Stuff
}
}

abstract class Bar : Foo
{
abstract override void DoSomeStuff();
}

如果对 abstract 的 abstract 覆盖是非法的,将 Foo 上的 DoSomeStuff 更改为 abstract 现在将阻止 Bar 编译。抽象覆盖是多余的,但没有潜在的负面影响,因此编译器可以接受。


Why isn't there a compiler warning informing me that what I've wrote does nothing?

编译器会为某些代表风险的事情生成警告:非显式方法隐藏、无法访问的代码、使用过时的方法等。唯一的“问题”是不必要的抽象覆盖可能表明代码没有有效地编写。这不是编译器关心的事情。


Is there some use case where abstract override on an abstract does something useful?

没有功能。但是,在一些用例中您可能会故意这样做:

  • 提高代码的“可读性”。拥有冗余的抽象覆盖将提醒该方法是抽象的。
  • 如果将来对基类的更改包括提供虚拟实现,您可以先发制人地阻止某些类访问该基类。
  • 如果抽象覆盖是多余的,因为基类从虚拟实现更改为抽象,则可以安全地保留它。

关于c# - 为什么我可以抽象覆盖抽象方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24792135/

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