c# – 为什么在基类引用中存储派生类型是合法的?
假设我们已经声明了这两个类:
public class Animal { //..... } public class Dog : Animal { //..... } 好吧,我的问题是:为什么下面的代码行有效? 动物动物=新狗(); 编辑: 在电子书“专业C#2008”中,有一段说:
解决方法
你正在创造一个新的狗,但是你正在将它作为动物来对待(使用).
当你想拥有一些由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(),但我没有说明它们应该如何移动 – 这就是了以个体动物来指定 现在,如果我这样做: Animal caveman = new CaveMan(); Animal dog = new Dog(); caveman.MakeSignatureSound(); dog.MakeSignatureSound(); 我将在控制台上得到这个: Ugggg Woof 但是因为我使用了抽象基类,我不能直接实例化它的实例,我不能这样做: Animal animal = new Animal(); 作为开发人员,我想确保当其他人(或我自己)创建新动物时,它必须是特定类型,而不仅仅是没有行为或特征的纯动物. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |