关于多态的疑惑?
本人初学多态,有几个问题想请教大家,请大家多帮忙!
问题1:父类变量存储子类引用,但为什么不能够使用子类对象特有的方法和属性,在内存中它们是怎么表示的呢?
先看下代码
- C# code
//父类 class Person { public Person() { } public void Hi() { Console.WriteLine(" Excute Person Hi()"); } } //子类 class Student:Person { public void Hi() { Console.WriteLine("Excute Student Hi()"); } } //主方法 class Program { static void Main(string[] args) { Person person = new Student(); person.Hi(); } }
问题2:重写后,还是父类变量存储子类引用,为何就可以实现使用子类的方法和属性?这时在内存中是怎样展现的呢?
[解决办法]
在面向对象语言中,继承树上的定义才是“正宗”,子类中另外的重名但是签名错误的方法是“异类”。按说编译器应该默认地拒绝编译这类方法,除非你另外再写一个Attribute之类的复杂声明才允许使用。不过c#大概是早期兼容c++的缘故,保留着这类破坏面向对象编程风格的语法。
你使用一个定义为Person的变量去调用,那么当然编译器就失去找兼容于Person类的方法,比如说Student中的重写Person的方法,而不是Student的异类方法。