多态性的问题

本文解析了 C# 中 Animal 和 Cow 类型转换的细节,介绍了父类引用指向子类对象的概念,以及如何通过重写和隐藏方法实现多态性。

不好意思 还没说问题  
Animal myAnimal=(Animal)myCow;
Animal myAnimal = myCow
这两句代码具体有什么区别呢?放在这里运行后输出的都是 派生类Cow中的EatFood

第二句是第一句的简化写法。调用的虚方法是根据你实例化的对象而定,和指向对象的引用类型无关。

父类可以指向(引用)子类对象
override重写,是指对父类中的虚方法(标记virtual)或抽象方法(标记为abstract)进行重写,实现新的功能,它必须与父类方法的签名完全一致.与父类方法的可访问性也必须一致 new隐藏,是指在子类中重新定义一个签名与父类的方法相同的方法,这个方法可以不用new修饰,只是编译时会弹出一个警告信息:如果是有意隐藏,请使用关键字new。
Animal myAnimal = myCow;
将子类对象赋给基类对象,这时基类对象便可调用子类中的方法;
不同子类具有特定的从基类继承来的方法.

“将子类对象赋给基类对象”?

myCow变量所指引的的对象既然是一个Cow,那么当然也就是一个Animal,因此使用变量 myAnimal 跟 变量 myCow 都可以指引一个 Cow 对象实体。

.net是面向对象语言,因此支持最基本的面向对象语法。这里并不存在什么“把子类对象赋值给基类对象”的概念。在定义类型时,我们定义Cow继承自Animal,编译器帮我们处理对于 myCow 所代表的对象的生成。

不要把类型“定义时”的继承关系,误认为是“运行时”的什么子类对象内部还有个什么指针指向父类对象,更不是“运行时”把一个对象赋值给另一个对象。

我想lz可以重温一下中国文化中的关于“白马非马”的典故。它是说一个叫做公孙龙的人如何狡辩而蒙混过关的故事。

面向对象设计方式实现了“白马也是马”的编译机制,因此myCow所指引的对象就是myAnimal所指引的对象,死抠字眼把“类型转换”概念仅仅理解为对象之间的复制是错误的。一个Cow同时也就是那个Animal,指的是同一个对象只是我们用两种不同的标识来引用它罢了。
 

sp1234的解释还是太术语化了,如果是明白的人看了就会更明白,但是楼主显然还是有些糊涂,这么解释好像他还是不会太明白的,
楼主要区分对象和实例之间的概念的不同之处,对象可以理解为名字,实例则是实实在在存在的东西,
 Animal myAnimal=new Animal(); 这句话就是虚的,你用的方法就是纸面上的,eatfood不会产生实际的效果
而Cow myCow = new Cow();则是实际产生了一头牛,那么Animal myAnimal = myCow;就是说现在把实实在在存在的牛叫做动物了,那现在再调用那个eatfood方法就是牛的吃了,就是实际产生的动作
至于为什么这么做,我理解的其中一个好处就是为了代码的可复用,可扩展,
来源:nba直播

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值