日期:2014-05-18  浏览次数:20999 次

关于多态的疑惑?
本人初学多态,有几个问题想请教大家,请大家多帮忙!

问题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的异类方法。