我有一个基类和一个派生类
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
我哪里错了?
答案 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()
{
}
}