模拟父类方法的实现

本文关键字:实现 类方法 父类 模拟 | 更新日期: 2023-09-27 17:56:45

我想模拟类 Test2 方法Parent实现,以便它应该返回子实现。

public class Program
{
    static void Main(string[] args)
    {
        var child = new Child();
        child.print();
        Console.ReadLine();
    }
}
//Parent Class
public class Parent
{
    public void print()
    {
        Test1();
    }
    protected void Test1()
    {
        Test2();
    }
    protected void Test2()
    {
        Console.WriteLine("Parent Test2");
    }
}
//Child Class
public class Child : Parent
{
    protected void Test2()
    {
        Console.WriteLine("Child Test2");
    }
}

输出:父测试2

但我希望输出是子测试2。有什么方法可以在不修改父类中的任何代码的情况下做到这一点。

模拟父类方法的实现

Test2需要在Parent中标记为virtual,在Child中标记为override,以获得所需的语义。

如果不修改Parent类,就无法获得所需的语义。

你可以这样做,但建议只用于测试和研究目的,因为这将是一个巨大的黑客。

看看这篇文章:http://www.codeproject.com/Articles/37549/CLR-Injection-Runtime-Method-Replacer

简而言之,您需要做的是在运行时获取方法句柄,并将其替换为以您喜欢的方式实现调用的另一个方法。然后,您可以使用反射来访问任何其他方法。

这将起作用,但我认为对于任何商业和生产解决方案都应该避免。

如果你真的想在没有Parent virtual的情况下做到这一点,你可以在Child中定义以下内容:

    public new void print()
    {
        Test2();
    }

然后,更改Test2()的定义以包括new关键字。 但是,如果您可以帮助它,我不建议仅声明Test2() virtual

简单地定义这两个方法已经隐藏了基类中的实现,但添加 new 关键字可以明确表示这是您要执行的操作。 如果没有关键字,您还将收到编译器警告。