C#upcasting / downcasting继承

时间:2013-12-10 21:25:27

标签: c# inheritance

为什么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();
        }
    }
}

3 个答案:

答案 0 :(得分:2)

您的Mammals类将BreastFeed()定义为虚拟方法,这意味着它可以被其子级覆盖。

Fish类使用自己的实现正确覆盖该方法。这意味着,只要您实例化该类并将其视为FishMammals,就会调用重写实现。这正是覆盖虚拟方法应该做的事情。

如果您对事物的定义略有不同并隐藏了BreastFeed()方法而不是覆盖它,那么您将获得您期望的行为。

答案 1 :(得分:1)

  

为什么testMammal调用的testMammal.BreastFeed()没有调用   哺乳动物的BreastFeed方法?

testMammalFish投放到MammalsBreastFeed()将调用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

抽象方法的覆盖方式与虚方法相同。这可能会避免混淆,并会突出显示任何忘记被错误覆盖的方法。