2015-06-16 115 views
0

我想模拟执行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"); 
    } 
} 

输出:家长的Test2

但我想输出为儿童的Test2。有没有什么办法可以做到这一点,而无需修改父类中的任何代码。

+2

这是为什么用Java标记的? – mhlz

+0

因为它的OOP相关问题。道歉,如果我不应该。 – TBAG

+0

只包含与您的问题直接相关的标签。 –

回答

1

Test2需要在ChildParentoverride被标记为virtual有你想要的语义。

在没有修改Parent类的情况下,没有办法拥有所需的语义。

+0

感谢您的回复。但是我不想在父类 – TBAG

+0

@TBAG中更改代码那么你的运气不好。您提供的“Parent”实施主动防止您想要的行为。它专门设计用来防止任何子类通过使其非虚拟性覆盖其方法的行为。 – Servy

0

你可以做到这一点,但它建议留在测试和研究目的,因为这将是一个巨大的黑客。

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

总而言之一句话是你必须做的是在运行时获得的方法处理并更换为implementes在你喜欢的方式调用的另一种方法。然后,您可以使用反射来访问任何其他方法。

这会行得通,但我认为应该避免任何商业和生产性解决方案。

0

如果你真的想这样做,而不在Parentvirtual,你可以定义Child如下:

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

然后,更改的Test2()的定义还包括new关键字。不过,如果你能帮到的话,我不会推荐这个,只是宣布Test2()virtual

简单地定义这两种方法将已经隐藏基类中的实现,但添加new关键字会明确表示它是您打算执行的操作。没有关键字,您也会收到编译器警告。

+0

在这里添加'new'只会去除警告,它不会改变任何东西。特别是这意味着*他仍然没有所需的语义*,他的程序将会调用'Test2'的错误实现。 – Servy

+0

@Servy我已经在我的回答中说过了。这就是为什么他必须在'Child'中创建'print()'方法来隐藏'Parent'中的实现。 – Lunyx

相关问题