静态继承就像实例继承一样工作。除非您不允许将静态方法设为虚拟或抽象。
class Program {
static void Main(string[] args) {
TestBase.TargetMethod();
TestChild.TargetMethod();
TestBase.Operation();
TestChild.Operation();
}
}
class TestBase {
public static void TargetMethod() {
Console.WriteLine("Base class");
}
public static void Operation() {
TargetMethod();
}
}
class TestChild : TestBase {
public static new void TargetMethod() {
Console.WriteLine("Child class");
}
}
这将输出:
Base class
Child class
Base class
Base class
但是我想要:
Base class
Child class
Base class
Child class
如果我可以使用静态方法,我会将 TargetMethod 设为虚拟的,它就可以完成这项工作。但是是否有变通方法来获得相同的效果?
编辑:是的,我可以在子类中放置一个 Operation 的副本,但这需要将大量代码复制并粘贴到每个子类中,在我的例子中大约有 35 个类,这是一个维护噩梦。
p>最佳答案
不,您不能覆盖静态方法。 “static”也意味着它是被编译器静态绑定(bind)的,所以实际要调用的方法不是在运行时找到的,而是在编译时绑定(bind)的。
您应该做的是使类成为非静态类。使该方法成为虚拟方法并覆盖它并充分利用真正的继承。然后,如果您真的需要它,请为您的类的引用创建一个静态入口点。例如静态工厂、单例(在大多数情况下它是一种反模式,但与静态类一样好)或只是一个静态属性。
关于C# 虚拟(或抽象)静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/763344/