加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 为什么在基类引用中存储派生类型是合法的?

发布时间:2020-12-15 19:43:51 所属栏目:百科 来源:网络整理
导读:假设我们已经声明了这两个类: public class Animal{ //.....}public class Dog : Animal{ //.....} 好吧,我的问题是:为什么下面的代码行有效? 动物动物=新狗(); 编辑: 在电子书“专业C#2008”中,有一段说: It’s always safe to store a derived type w
假设我们已经声明了这两个类:

public class Animal
{
    //.....
}

public class Dog : Animal
{
    //.....
}

好吧,我的问题是:为什么下面的代码行有效?

动物动物=新狗();

编辑:

在电子书“专业C#2008”中,有一段说:

It’s always safe to store a derived type within a base class reference.

解决方法

你正在创造一个新的狗,但是你正在将它作为动物来对待(使用).

当你想拥有一些由Animal拥有或暴露的行为时,这尤其有用,但Dog可能会用不同的东西覆盖它.狗可以用作狗或动物,因为它是两者.

编辑:这是一个简单的例子,我将使用一个抽象基类,这样你就可以看到这种安排的真正价值:

public abstract class Animal
{
    public abstract void Move();

    public virtual void MakeSignatureSound() 
    {
        Console.WriteLine("Ugggg");
    }
}

public class Dog : Animal 
{
    public override void Move() 
    {
        RunLikeAPuppy();
    }

    public override void MakeSignatureSound()
    {
        Console.WriteLine("Woof");
    }
}

public class CaveMan : Animal
{
    public override void Move() 
    {
        RunLikeANeanderthal();
    }
}

public class Cat : Animal
{
    public override void Move() 
    {
        RunLikeAKitteh();
    }

    public override void MakeSignatureSound()
    {
        Console.WriteLine("Meioww");
    }
}

请注意两件事:

> Animal类中的所有三个派生词都必须覆盖Move()函数,因为在我的基类中我决定所有动物都应该有一个Move(),但我没有说明它们应该如何移动 – 这就是了以个体动物来指定
> CaveMan类没有覆盖MakeSignatureSound()函数,因为它已经在基类中定义了,对他来说已经足够了

现在,如果我这样做:

Animal caveman = new CaveMan();
Animal dog = new Dog();
caveman.MakeSignatureSound();
dog.MakeSignatureSound();

我将在控制台上得到这个:

Ugggg
Woof

但是因为我使用了抽象基类,我不能直接实例化它的实例,我不能这样做:

Animal animal = new Animal();

作为开发人员,我想确保当其他人(或我自己)创建新动物时,它必须是特定类型,而不仅仅是没有行为或特征的纯动物.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读