覆盖一个方法并转换为基类型后,将调用哪个方法?

时间:2017-04-07 00:55:06

标签: c# inheritance

如果我们有这个课程:

public class a{
     public void b(){ Console.WriteLine("a"); }
}

然后这堂课:

public class c : a{
     public override void b(){ Console.WriteLine("c"); }
}

如果我这样做:

a _a = new c();
_a.b();

会发生什么?将调用哪种方法?基类型或被覆盖的那个?

3 个答案:

答案 0 :(得分:1)

  

会发生什么?将调用哪种方法?基类型的那个,   还是被覆盖的?

首先,您没有覆盖课程ba课程中的c方法,因为您没有将其标记为virtual(应该给你一个编译时错误,如果你已经尝试过)。但是,如果您将类a中的方法标记为virtual,如下所示:

public class a
{
    public virtual void b() { Console.WriteLine("a"); }
}

然后将打印出的结果为"c"。原因是overriding机制。

答案 1 :(得分:0)

这是一个错误,基类的方法必须标记为virtualabstractoverride

如果您在示例中将abstractvirtual添加到基类的方法中,就像执行调用一样,将执行重写的方法 - 这就是整个点override

如果您不希望基类的方法为virtualabstract,则可以在子类的方法上使用new它将被替换,但不会被覆盖。也就是说,将执行引用b()的类的方法_a,在您的示例中,类b上的方法a将是执行。

答案 2 :(得分:0)

有三种方法可以重复使用"一种方法。

重写方法要求将该方法标记为抽象或虚拟。覆盖方法时,无论如何都会调用重写的方法。但是,您可以调用基本方法,如:

base.Method();

重载允许您更改方法使用的参数的类型和数量。所以:

public int Method(int A); 

可以重载为:

public int Method(double B);

最后你有新的。这允许您替换派生类中的Method。如果您有方法:

public int Method();
在基类中

并创建一个新方法

public new int Method();

在派生类中,您的新方法将在派生类中调用,但如果将类强制转换回基类,则将调用基类方法。我知道的解释不是很明确,但我现在的时间很短。

希望这会有所帮助 丹尼