你的位置:首页 > ASP.net教程

[ASP.net教程]继承的本质的个人学习笔记


对继承的本质的一些理解,看了些文章和博客,总结成自己的文字加深一下理解,可能表达和理解的不是很透彻,请带着批判的眼光阅读~
先附上大神们的文章~

http://www.cnblogs.com/pbwf/archive/2008/03/27/1125451.html


new创建对象时,递归查找父类,分配内存,最先创建的应该是object。
对象是在运行时创建的,方法是在编译时创建,对象字段和方法的创建和调用遵循执行就近原则,因此子类会拷贝父类的方法和字段,父类的字段和方法在前,子类的新添加的方法和字段在后,调用按字段和方法存储的顺序调用,如果子类重写父类的方法,就会覆盖从父类拷贝的方法,如果用new定义同名方法,就会隐藏父类方法的实现,父类的方法还存在,排在子类同名方法前
调用的方法是子类还是父类的,和引用类型无关,只和创建的对象是子类还是父类对象有关(关注对象原则),同时声明引用类型的不同只会决定对方法的访问权限的不同,父类可以声明创建子类对象,是因为子类会继承拷贝父类的方法和字段,在子类中父类型的引用具有访问权限。而子类不可声明和创建父类对象是因为,父类中子类指针是不具有访问权限的。
父类型的引用只能调用子类中从父类拷贝的方法和字段,对子类新添加的方法和字段是无法调用的。子类型的引用调用的优先级按父类在前,子类的在后原则,如果子类使用new定义了同名方法,那么就会隐藏父类的方法,优先调用子类的方法


简单的助于理解的代码:
 public class Bird
    {
        private string type = "bird";
        public virtual string ShowType()
        {
            return "bird";
        }
    }

    public class Chicken : Bird
    {
        private new string type = "chicken";
        public string show()
        {
            return "chicken";
        }
        public override  string ShowType()
        {
            return "chicken";
        }
    }
调用代码如下:
            Bird bird = new Chicken();
            Chicken chicken = new Chicken();
            string str1 = bird.ShowType();
            string str2 = chicken.ShowType();
结果:str1-chicken str2-chicken

改一下子类的方法
 public class Chicken : Bird
    {
        private new string type = "chicken";
        public string show()
        {
            return "chicken";
        }
        public new string ShowType()
        {
            return "chicken";
        }
    }
结果:str1-bird str2-chicken 
虽然创建的都是chicken对象,但是bird是无法调用chicken中的show()方法的,chicken是可以的,这就是引用类型的访问权限的不同。