我试图在C#中覆盖重写的方法(如果这有意义!)。
我有一个类似于下面的场景,但是当我在“C”类的SampleMethod()中有一个断点时,它没有被击中,而“B”方法中的相同断点被击中。
public class A
{
protected virtual void SampleMethod() {}
}
public class B : A
{
protected override void SampleMethod()
{
base.SampleMethod();
}
}
public class C : B
{
protected override void SampleMethod()
{
base.SampleMethod();
}
}
提前致谢!
修改:
好的,上下文会有所帮助:
这是在复合控件的上下文中,因此类A继承CompositeControl并在覆盖CreateChildControls()方法后调用SampleMethod()。
答案 0 :(得分:36)
只要您愿意,就可以在链中执行覆盖。您显示的代码是正确的。
您所看到的行为的唯一可能解释是您引用的对象实际上是B
类型。我建议您仔细检查一下,如果事情仍然没有意义,请发布其他合适的代码。
答案 1 :(得分:17)
如果没有看到调用SampleMethod的代码,我的猜测就是你有一个B类型的对象并在其上调用SampleMethod。
答案 2 :(得分:3)
断点很可能没有被击中,因为你实际上实例化了一个“B”类的实例。
方法覆盖解析基于应该调用其方法的类的实际运行时类型。所以,如果您有以下代码:
C c = new C();
c.SampleMethod();
以及以下内容:
C c = new C();
B b = (B)c;
b.SampleMethod();
将调用SampleMethod
的类的运行时类型都是B
类型。
答案 3 :(得分:2)
该解决方案工作正常;虽然要在方法所在的课外实际使用它,但您需要在出现的所有情况下设置SampleMethod
到public
而不是protected
的访问权限,因此:
public class A
{
public virtual void SampleMethod()
{
Console.WriteLine("lol");
}
}
public class B : A
{
public override void SampleMethod()
{
base.SampleMethod();
}
}
public class C : B
{
public override void SampleMethod()
{
base.SampleMethod();
}
}
答案 4 :(得分:1)
在层次结构中多次覆盖使用类似这样的内容
router.get('/about', function(req, res) {
res.send(magic_configuration.about_text);
});
....
magically_set_config(router, {about_text: "Bears eat fish"})
app.use('/bears', router);
我在此链接的代码中完成了它 http://www.4shared.com/rar/0SG0Rklxce/OverridingMoeThanOnce.html
答案 5 :(得分:-1)
方法重写是OOP功能,它允许子类提供已由其父类之一提供的方法的特定实现。