【问题标题】:how to change sealed class method by static class or another way?如何通过静态类或其他方式更改密封类方法?
【发布时间】:2014-12-13 10:15:52
【问题描述】:

我想从静态类重写密封类的方法。

例如:

public class MyClass
{
    public virtual void MyMethod()
    {
        Console.WriteLine("I'm MyMethod from MyClass");
    }
}

public sealed class MySealedClass : MyClass
{
    public override void MyMethod()
    {
        Console.WriteLine("I'm MyMethod from MySealedClass");
    }
}

MyClass 有一个名为 MyMethod 的虚拟方法。

在密封类中,此方法已被 self 覆盖,我想通过此静态类为另一项工作再次编写该方法:

public static class ClassManager
{
    public static void MyMethod(this MySealedClass msc)
    {
        Console.WriteLine("I'm MyMethod from ClassManager");
    }
}

现在,我们调用 Program 类中的静态方法来运行它:

class Program
{
    static void Main(string[] args)
    {
        new MySealedClass().MyMethod();
    }
}

但是这个结果叫做 MySealedClass 方法而不是我的静态类方法的!!

我是来自 MySealedClass 的 MyMethod

请帮助我,如何通过静态类或其他方式更改密封类方法?

【问题讨论】:

    标签: c# static overriding sealed


    【解决方案1】:

    您不能这样做。仅当您的类型中没有具有该签名的方法时才考虑扩展方法。

    您需要显式调用static 方法:

    ClassManager.MyMethod(new MySealedClass());
    

    【讨论】:

      【解决方案2】:

      这是不可能的。来自MSDN

      与接口或类方法具有相同名称和签名的扩展方法永远不会被调用。在编译时,扩展方法的优先级总是低于类型本身定义的实例方法。换句话说,如果一个类型有一个名为 Process(int i) 的方法,并且你有一个具有相同签名的扩展方法,编译器将始终绑定到实例方法。

      来自 C# 规范:

      前面的规则(规范中指定的规则集)意味着实例方法优先于扩展方法,内部命名空间声明中可用的扩展方法优先于外部命名空间中可用的扩展方法声明,并且直接在命名空间中声明的扩展方法优先于使用命名空间指令导入同一命名空间的扩展方法。

      您必须通过静态类调用该方法,而不是作为扩展方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-01
        • 2019-12-15
        • 1970-01-01
        • 2021-12-15
        • 1970-01-01
        • 2013-09-04
        • 2013-05-08
        • 1970-01-01
        相关资源
        最近更新 更多