c#upcasting/downcasting inheritance继承

C# upcasting/downcasting inheritance

为什么testmapolma.feeded()不是由testmapolma调用的哺乳类方法?什么是试验哺乳动物?左边是表示类型还是右边?Mammals testMammal = (aWhale as Mammals)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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时,都将调用重写的实现。这正是重写虚拟方法应该做的。

如果您定义的东西有点不同,并且隐藏了BreastFeed()方法而不是重写它,那么您将得到您期望的行为。


Mammals中把你的BreastFeed()方法定义为abstract可能是有意义的。这样做时,您就不会在基类中提供任何实现,在本例中,它是Mammals。它必须在子类中被重写,否则程序将无法编译。

您还可以将类Mammals定义为abstract

抽象方法被重写的方式与虚拟方法相同。这可以防止混淆,并突出显示任何被错误地忽略的方法。


Why does testMammal.BreastFeed() called by testMammal not call the
BreastFeed method of Mammals class?

testMammal是一个Fish铸造给Mammals的。BreastFeed()将在Fish上调用。

What is the type of testMammal?

1
Mammals

Does the left side indicate type or the right side?

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

这是:

1
Mammals testMammal = (aWhale as Mammals);

是一样的

1
Mammals textMammal = new Fish();

对象是鱼,变量是哺乳动物类型。您只能调用Mammals的公共成员,但任何覆盖的成员都将是Fish's成员。