如果我们有这个课程:
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();
会发生什么?将调用哪种方法?基类型或被覆盖的那个?
答案 0 :(得分:1)
会发生什么?将调用哪种方法?基类型的那个, 还是被覆盖的?
首先,您没有覆盖课程b
中a
课程中的c
方法,因为您没有将其标记为virtual
(应该给你一个编译时错误,如果你已经尝试过)。但是,如果您将类a
中的方法标记为virtual
,如下所示:
public class a
{
public virtual void b() { Console.WriteLine("a"); }
}
然后将打印出的结果为"c"
。原因是overriding
机制。
答案 1 :(得分:0)
这是一个错误,基类的方法必须标记为virtual
,abstract
或override
。
如果您在示例中将abstract
或virtual
添加到基类的方法中,就像执行调用一样,将执行重写的方法 - 这就是整个点override
。
如果您不希望基类的方法为virtual
或abstract
,则可以在子类的方法上使用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();
在派生类中,您的新方法将在派生类中调用,但如果将类强制转换回基类,则将调用基类方法。我知道的解释不是很明确,但我现在的时间很短。
希望这会有所帮助 丹尼