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

时间:2012-06-04 10:59:39

标签: c# static

为什么virtual,abstract和override关键字对Static函数无效?它背后的逻辑是什么?

5 个答案:

答案 0 :(得分:3)

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

使用静态调用而不是虚拟调用来调用静态方法;在编译时决定调用什么方法完全。没有决定。它归结为SomeType中的SomeType.SomeMethod(...args...)。您当然可以在虚拟方法中的方法之间调用 - 您仍然可以访问SomeBaseType.SomeOtherStaticMethod(...)

答案 1 :(得分:1)

事实上,有一些语言可以将多态概念扩展到静态方法。但是,C#不是这些语言之一。你不能通过某种类引用来调用静态函数,所以你实际上没有机会在那里做任何“多态”。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

我想C#人不会让你假装静态的东西可能被覆盖......但事实并非如此。为了调用它,你必须指定类型(明确地像MyType.StaticMethod() ,或隐含地如上所述)。他们选择明确表示你不能拥有虚拟静态方法并让它像你期望的那样工作,因为你完全不能这样做。

答案 4 :(得分:0)

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