模拟父类方法的实现
本文关键字:实现 类方法 父类 模拟 | 更新日期: 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
关键字可以明确表示这是您要执行的操作。 如果没有关键字,您还将收到编译器警告。