始终调用基类的方法

时间:2017-04-20 04:24:34

标签: c# oop inheritance

我有一个基类和一个派生类

public interface IDispatch {
    void DoSomething();
}

public class Foo : IDispatch {
    void DoSomething() {

    }
}

public class Bar : Foo {
     void DoSomething() {

    }
}

我有一个功能,根据条件,我引用它。

  Foo randomfunc(Foo f){
    if(...){
         f = new Foo();
    }else{
         f = new Bar();
    }
   f.dosomething(); // this works fine
   return f;

    }

但是在方法调用中

Foo qwe;
qwe = randomfunc(f);
qwe.doSomething(); //it calls doSomething() from Foo() even though it references Bar

我哪里错了?

1 个答案:

答案 0 :(得分:4)

隐藏方法,而不是覆盖它们。实际上,您将收到有关您编写的代码的警告(假设您修复了编译器错误,因为您使用私有方法实现了接口)。

此:

public class Bar : Foo
{
    public void DoSomething()
    {

    }
}

等同于:

public class Bar : Foo
{
    public new void DoSomething()
    {

    }
}

然而,后者会阻止警告,因为它告诉编译器“我知道我在做什么”。

使用方法隐藏,这意味着Bar的实现仅在您调用它的对象被转换为Bar 时才会被调用。这就是你在这里遇到的行为。您实际想要做的是覆盖该方法,而不是隐藏它。例如:

public class Foo : IDispatch
{
    public virtual void DoSomething()
    {

    }
}

public class Bar : Foo
{
    public override void DoSomething()
    {

    }
}