为什么testMammal调用的testMammal.BreastFeed()不调用Mammals类的BreastFeed方法? testMammal的类型是什么?左侧是指示类型还是右侧? Mammals testMammal = (aWhale as Mammals)
using System;
using System.Collections.Generic;
namespace ConsoleApplication3
{
class Mammals
{
public string age { get; set; }
public virtual void BreastFeed()
{
Console.WriteLine("This animal Breastfeeds its young ones.");
}
}
class Fish : Mammals
{
public int FinsNum { get; set; }
public override void BreastFeed()
{
Console.WriteLine("This animal Breastfeeds its young ones fish style");
}
}
class Program
{
static void Main(string[] args)
{
Fish aWhale = new Fish();
//Mammals testMammal = (Mammals)aWhale;
Mammals testMammal = (aWhale as Mammals);
testMammal.BreastFeed();
}
}
}
答案 0 :(得分:2)
您的Mammals
类将BreastFeed()
定义为虚拟方法,这意味着它可以被其子级覆盖。
Fish
类使用自己的实现正确覆盖该方法。这意味着,只要您实例化该类并将其视为Fish
或Mammals
,就会调用重写实现。这正是覆盖虚拟方法应该做的事情。
如果您对事物的定义略有不同并隐藏了BreastFeed()
方法而不是覆盖它,那么您将获得您期望的行为。
答案 1 :(得分:1)
为什么testMammal调用的testMammal.BreastFeed()没有调用 哺乳动物的BreastFeed方法?
testMammal
是Fish
投放到Mammals
。 BreastFeed()
将调用Fish
testMammal的类型是什么?
Mammals
左侧是指示类型还是右侧?
左侧是变量的类型。变量引用的对象可以是Mammals
或任何子类。
此:
Mammals testMammal = (aWhale as Mammals);
与
相同Mammals textMammal = new Fish();
对象是Fish,变量是Mammals类型。您只能呼叫Mammals
的公开成员,但任何被覆盖的成员都将是Fish's
成员。
答案 2 :(得分:1)
在BreastFeed()
中将Mammals
方法定义为abstract
可能是有意义的。这样做时,您不会在基类中提供任何实现,在本例中为Mammals
。它必须在子类中重写,否则程序将无法编译。
您还可以将班级Mammals
定义为abstract
。
抽象方法的覆盖方式与虚方法相同。这可能会避免混淆,并会突出显示任何忘记被错误覆盖的方法。