可以在静态方法在C#中被重写?(Can a static method be overridden

2019-07-19 17:58发布

有人告诉我, static方法是隐含final ,因此不能被重写。 真的吗?

  1. 有人可以给重写一个静态方法的一个更好的榜样?

  2. 如果静态方法只是类方法,什么是真正的使用具有他们的?

Answer 1:

(1)静态方法不能被重写,就可以使用但“新”的关键字被隐藏。 大多是压倒一切的方法意味着你引用的基本类型和要调用派生方法。 由于静电的是类型的一部分,不受虚函数表查找那没有意义。

如静不能做:

public class Foo { 
    public virtual void Bar() { ... }
}
public class Bar : Foo {
    public override void Bar() { ... }
}

// use:
Foo foo = new Bar(); // make an instance
foo.Bar(); // calls Bar::Bar

由于静不上情况下工作,你总是指定Foo.Bar或Bar.Bar明确。 所以首要的已经没有意义了这里(尝试在代码中表达它...)。

(2)存在用于静态方法不同的用途。 例如,它正在Singleton模式用于获取类型的单个实例。 另一个例子是“静态无效的主要”,这是你的程序的主要接入点。

基本上你使用他们时,你不想或者使用之前不能创建一个对象实例。 例如,当静态方法创建的对象。

[更新]

一个简单的隐藏例如:

public class StaticTest
{
    public static void Foo() { Console.WriteLine("Foo 1"); }
    public static void Bar() { Console.WriteLine("Bar 1"); }
}

public class StaticTest2 : StaticTest
{
    public new static void Foo() { Console.WriteLine("Foo 2"); }
    public static void Some() { Foo(); Bar(); } // Will print Foo 2, Bar 1
}

public class TestStatic
{
    static void Main(string[] args)
    {
        StaticTest2.Foo();
        StaticTest2.Some();
        StaticTest.Foo();
        Console.ReadLine();
    }
}

请注意,如果你把类static ,你不能做到这一点。 静态类具有派生object

这和继承之间的主要区别是,编译器可以在编译时使用静态当调用该方法确定。 如果你有对象的情况下,你需要在运行时做到这一点(这被称为虚函数表查找)。



Answer 2:

你不覆盖静态方法。 你隐藏它。 见这个答案获取更多信息。

部分原因是使用静态方法:

  1. 他们是有点快比实例方法。 也看到这个MSDN文章这使性能数据来支持这一行动(平均0.2纳秒内联静态调用,静态调用平均6.1ns,内联实例调用平均1.1纳秒,例如呼叫平均6.8纳秒)
  2. 那么详细的写出来 - 不需要实例化一个类来获得他们(和实例化也可能会影响性能)


Answer 3:

但是你不能覆盖静态方法。 静态方法不能是虚拟的,因为它是不相关的类的实例。

在派生类的“覆盖”的方法实际上是一种新的方法,无关在基类中定义的一个(因此新的关键字)。

这是需要理解的重要事情:当类型从其他类型继承,他们履行共用签约,而静态类型不受任何合同约束(但从纯OOP点)。 有一个在语言没有任何技术的方式与“继承”的合同,以配合两个静态类型在一起。 如果你想在两个不同的地方“越权”的登录方法。

如果您想了解重写静态方法,它并没有真正意义; 为了有虚拟派遣你需要一个对象要检查的实际情况。

静态方法也无法实现的接口; 如果这个类实现一个接口IRolesService,那么我会认为它的方法不应该是在所有静态的。 这是更好的设计有一个实例方法,所以你可以换出你的MockRoleService一个真正的服务,当你准备好



文章来源: Can a static method be overridden in C#?