繁体   English   中英

C#upcasting / downcasting继承

[英]C# upcasting/downcasting 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();
        }
    }
}

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

Fish类使用自己的实现正确覆盖该方法。 这意味着每次实例化该类并将其视为FishMammals ,都会调用override实现。 这正是覆盖虚拟方法应该做的事情。

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

为什么testMammal调用的testMammal.BreastFeed()不调用Mammals类的BreastFeed方法?

testMammal是一种testMammal MammalsFish 将在Fish上调用BreastFeed()

testMammal的类型是什么?

Mammals

左侧是指示类型还是右侧?

左侧是变量的类型。 变量引用的对象可以是Mammals或任何子类。

这个:

Mammals testMammal = (aWhale as Mammals);

是相同的

Mammals textMammal = new Fish(); 

对象是Fish,变量是Mammals类型。 您只能呼叫Mammals公共成员,但任何被压倒的成员都将成为Fish's成员。

Mammals BreastFeed()方法定义为abstract可能是有意义的。 这样做你不提供在基类,在这种情况下是任何实现Mammals 必须在子类中重写它,否则程序将无法编译。

您也可以将Mammals类定义为abstract类。

抽象方法的覆盖方式与虚方法相同。 这可以防止混淆,并强调任何忘记被错误覆盖的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM