我想模拟Parent
类Test2方法的实现,以便它返回子实现。
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");
}
}
输出:Parent Test2
但我希望输出为Child Test2。如果不修改父类中的任何代码,我有什么方法可以做到这一点。
答案 0 :(得分:1)
echo "(?U0 ?U2 ?U9 ?U11 ?U21)" | sed 's/[^0-9 ]*//g'
需要在Test2
中标记为virtual
,在Parent
中标记为override
,以获得您想要的语义。
如果不修改Child
类,就无法获得所需的语义。
答案 1 :(得分:0)
你可以做到这一点,但建议仅留待测试和研究目的,因为这将是一个巨大的黑客。
看看这篇文章: http://www.codeproject.com/Articles/37549/CLR-Injection-Runtime-Method-Replacer
简而言之,您需要做的是在运行时获取方法句柄并将其替换为另一种以您喜欢的方式实现调用的方法。然后,您可以使用反射来访问任何其他方法。
这可行,但我认为应该避免任何商业和富有成效的解决方案。
答案 2 :(得分:0)
如果你真的想在virtual
中没有Parent
的情况下这样做,你可以在Child
中定义以下内容:
public new void print()
{
Test2();
}
然后,将Test2()
的定义更改为还包含new
关键字。但是,如果您可以提供Test2()
,我建议不要将virtual
声明为new
。
简单地定义这两种方法已经隐藏了基类中的实现,但添加//a
关键字使得它明确表明它是您打算做的。如果没有关键字,您也会收到编译器警告。