覆盖重写方法(C#)

时间:2009-07-20 11:06:21

标签: c# inheritance

我试图在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()。

6 个答案:

答案 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)

该解决方案工作正常;虽然要在方法所在的课外实际使用它,但您需要在出现的所有情况下设置SampleMethodpublic而不是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功能,它允许子类提供已由其父类之一提供的方法的特定实现。