C# 虚拟(或抽象)静态方法

标签 c# inheritance

静态继承就像实例继承一样工作。除非您不允许将静态方法设为虚拟或抽象。

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/

相关文章:

c# - 修改引用类型参数的方法不好吗?

c# - 防止 C# 由于无效用户输入而崩溃

C++实现计算派生类实例的基类

c++ - 访问模板父类的静态成员

.net - .Net中具有Count属性的最小接口(interface)是什么

c++ - 继承问题

c# - 在 ASP .Net Core Web API 中保持登录用户的状态

c# - Windows Phone 应用内购买 - 无法将 TValue 转换为 ProductListing

c# - ASP.NET MVC - 创建没有后备的自定义路由

javascript - 从 Webix 中的 View 继承 CSS