首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

关于多态的疑惑?解决方法

2012-03-12 
关于多态的疑惑?本人初学多态,有几个问题想请教大家,请大家多帮忙!问题1:父类变量存储子类引用,但为什么不

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

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

热点排行