为什么virtual,abstract和override关键字对Static函数无效?它背后的逻辑是什么?
答案 0 :(得分:3)
通过虚拟调度的多态性是通过使用目标实例的实际运行时类型来完成的,即实际obj
在obj.Bar(...args...)
中的含义。现在:如果你没有obj.
实例,那么它就没有意义来讨论多态性。
使用静态调用而不是虚拟调用来调用静态方法;在编译时决定调用什么方法完全。没有决定。它归结为SomeType
中的SomeType.SomeMethod(...args...)
。您当然可以在虚拟方法中的方法之间调用 - 您仍然可以访问SomeBaseType.SomeOtherStaticMethod(...)
。
答案 1 :(得分:1)
答案 2 :(得分:0)
静态方法实际上只是特定类的一部分,作为该方法的占位符。静态函数不会与声明它们的类共享生命周期或范围,并且它们实际上不是对象模型的一部分。
这些关键字(抽象,虚拟,覆盖)与继承模型相关,在静态上下文中没有任何意义。
答案 3 :(得分:0)
您不应该通过实例访问静态方法。 当你这样做时,C#并不关心变量中的对象类型;它取决于变量的类型。也就是说,抓住所有这些;在我的Visual Studio版本中,使用默认设置,您甚至不能允许通过实例使用静态方法。无论哪种方式,这意味着MyType obj = null; obj.StaticMethod();
有效,因为从不咨询对象。virtual static
不会做任何有价值的事情; virtual
和override
通过咨询对象来决定使用哪种方法,而使用static
,只有类型(有效地硬编码,因此对多态无用) )。 abstract
基本上“在你的班级中需要override
”,它也没用。
我想C#人不会让你假装静态的东西可能被覆盖......但事实并非如此。为了调用它,你必须指定类型(明确地像MyType.StaticMethod()
,或隐含地如上所述)。他们选择明确表示你不能拥有虚拟静态方法并让它像你期望的那样工作,因为你完全不能这样做。
答案 4 :(得分:0)
关键字virtual
,abstract
和override
与继承的方法一起使用。静态方法不是继承的。