关于多态的疑惑?
本人初学多态,有几个问题想请教大家,请大家多帮忙!
问题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的异类方法。