在我的例子中,继承发生了什么?而且,c#中的正确术语是什么?

Cha*_*lds 5 c# oop

我正在学习OOP,并对下面的代码究竟发生了什么有疑问.

我有经典的Dog Animal例子.Dog继承Animal.

public class Animal
{
    public string Name { get; set; }

    public virtual string Speak()
    {
        return "Animal Speak";
    }

    public string Hungry()
    {
        return this.Speak();
    }
}


public class Dog : Animal
{
    public override string Speak()
    {
        return "Dog Speak";
    }

    public string Fetch()
    {
        return "Fetch";
    }
}
Run Code Online (Sandbox Code Playgroud)

这两个问题均基于此任务: Animal a = new Dog();

  1. 当我声明Animal并将其设置为Dog引用时实际发生了什么.这是否有特定的术语?
  2. 当我打电话时a.Hungry(),输出是"Dog Speak".如果输出是"Dog Speak",为什么我不能打电话a.Fetch()?这里发生了什么?

任何有关特定主题的帮助和进一步阅读将不胜感激.

Ser*_*rvy 5

  1. 这是一个"向上倾斜".在C#中,存在从任何类型到任何类型的基本类型的隐式转换,因此您不需要做任何事情来处理它Dog就像它是一样Animal.(感谢Matt Burland提醒我这是合适的术语.)
  2. 因为变量的类型是Animal,正因为如此,你只能编译器访问权限的成员知道一个Animal可以上网,即SpeakHungry.它不知道Animal是一个Dog,所以它无法调用Fetch.变量需要是类型,Dog以便您能够调用Fetch它.