Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 始终调用基类中的方法_C#_Oop_Inheritance - Fatal编程技术网

C# 始终调用基类中的方法

C# 始终调用基类中的方法,c#,oop,inheritance,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(...){

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

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
我哪里出错了?

您正在隐藏这些方法,而不是重写它们。事实上,如果您修复了编译器错误,那么您编写的代码将收到一条警告,因为您正在使用私有方法实现接口

这:

相当于:

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

    }
}
但是,后者将防止出现警告,因为它告诉编译器我知道我在做什么

使用方法隐藏,这意味着只有当您在其上调用Bar的对象被强制转换为Bar时,才会调用Bar的实现。这就是你在这里所经历的行为。实际上,您要做的是重写该方法,而不是隐藏它。例如:

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

    }
}

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

    }
}
您正在隐藏这些方法,而不是重写它们。事实上,如果您修复了编译器错误,那么您编写的代码将收到一条警告,因为您正在使用私有方法实现接口

这:

相当于:

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

    }
}
但是,后者将防止出现警告,因为它告诉编译器我知道我在做什么

使用方法隐藏,这意味着只有当您在其上调用Bar的对象被强制转换为Bar时,才会调用Bar的实现。这就是你在这里所经历的行为。实际上,您要做的是重写该方法,而不是隐藏它。例如:

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

    }
}

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

    }
}

@虫族返回后,它会丢失引用吗?谁是qwe=randomfuncf@沙漠之狐;仅声明,引用部分在函数中完成。您不重写Bar中的DoSomething方法,而只是将其隐藏。所以,当您将地址设置为Bar作为Foo时,您将始终调用Foo的方法。这不应该很好,它甚至可能是不可编译的,因为缺少接口编译错误CS0737的公共实现。@YeldarKurmangaliyev在某种意义上隐藏它?我该怎么修理this@zerkms返回后,它会丢失引用吗?谁是qwe=randomfuncf@沙漠之狐;仅声明,引用部分在函数中完成。您不重写Bar中的DoSomething方法,而只是将其隐藏。所以,当您将地址设置为Bar作为Foo时,您将始终调用Foo的方法。这不应该很好,它甚至可能是不可编译的,因为缺少接口编译错误CS0737的公共实现。@YeldarKurmangaliyev在某种意义上隐藏它?我怎样才能解决这个问题