C#,为什么虚拟、抽象和覆盖关键字对静态函数无效

本文关键字:关键字 覆盖 静态函数 无效 抽象 为什么 虚拟 | 更新日期: 2023-09-27 18:36:21

为什么虚拟、抽象和覆盖关键字对静态函数无效?这背后的逻辑是什么?

C#,为什么虚拟、抽象和覆盖关键字对静态函数无效

通过虚拟调度的多态性是通过使用目标实例的实际运行时类型来完成的,即实际objobj.Bar(...args...)中是什么。现在:如果你没有obj.实例,讨论多态性是没有意义的

静态

方法是通过静态调用而不是虚拟调用来调用的;关于调用什么方法的决定完全在编译时做出。没有决定要做。归根结底是SomeType.SomeMethod(...args...) SomeType.当然,您仍然可以在虚拟方法中的方法之间调用 - 您仍然可以访问SomeBaseType.SomeOtherStaticMethod(...)

事实上,有一些语言将多态性概念扩展到静态方法。不过,C#不是这些语言之一。您不允许通过某种类引用调用静态函数,因此您实际上没有机会在那里执行任何"多态"操作。

静态方法实际上只是特定类的一部分,作为该方法的占位符。静态函数不与声明它们的类共享生存期或范围,并且它们实际上不是对象模型的一部分。

这些关键字(抽象、虚拟、覆盖)与继承模型相关,在静态上下文中没有任何意义。

您不应该通过实例访问静态方法。 当你这样做时,C# 不关心变量中的对象类型;它按变量的类型进行。也就是说,MyType obj = null; obj.StaticMethod();工作,因为从不咨询对象刮擦所有这些;在我的 Visual Studio 版本中,使用默认设置时,您甚至不允许通过实例使用静态方法。 无论哪种方式,这意味着virtual static不会做任何有价值的事情; virtualoverride通过咨询对象来决定使用什么方法,并且使用static,您只有类型(实际上是硬编码的,因此对多态性毫无用处)。 abstract基本上"需要你的班级override",它也没有用。

我想 C# 人员让你假装静态的东西可以被覆盖并不难......但不能。 为了调用它,你必须指定类型(显式地像MyType.StaticMethod(),或者如上所述隐式地)。 他们选择明确表示,你不能拥有虚拟静态方法并让它像你期望的那样工作,通过让它让你根本无法做到这一点。

关键字 virtualabstractoverride 与继承的方法一起使用。静态方法不是继承的。