有人告诉我, static
方法是隐含final
,因此不能被重写。 真的吗?
有人可以给重写一个静态方法的一个更好的榜样?
如果静态方法只是类方法,什么是真正的使用具有他们的?
有人告诉我, static
方法是隐含final
,因此不能被重写。 真的吗?
有人可以给重写一个静态方法的一个更好的榜样?
如果静态方法只是类方法,什么是真正的使用具有他们的?
(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
。
这和继承之间的主要区别是,编译器可以在编译时使用静态当调用该方法确定。 如果你有对象的情况下,你需要在运行时做到这一点(这被称为虚函数表查找)。
你不覆盖静态方法。 你隐藏它。 见这个答案获取更多信息。
部分原因是使用静态方法:
但是你不能覆盖静态方法。 静态方法不能是虚拟的,因为它是不相关的类的实例。
在派生类的“覆盖”的方法实际上是一种新的方法,无关在基类中定义的一个(因此新的关键字)。
这是需要理解的重要事情:当类型从其他类型继承,他们履行共用签约,而静态类型不受任何合同约束(但从纯OOP点)。 有一个在语言没有任何技术的方式与“继承”的合同,以配合两个静态类型在一起。 如果你想在两个不同的地方“越权”的登录方法。
如果您想了解重写静态方法,它并没有真正意义; 为了有虚拟派遣你需要一个对象要检查的实际情况。
静态方法也无法实现的接口; 如果这个类实现一个接口IRolesService,那么我会认为它的方法不应该是在所有静态的。 这是更好的设计有一个实例方法,所以你可以换出你的MockRoleService一个真正的服务,当你准备好