博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于继承的一知半解
阅读量:5928 次
发布时间:2019-06-19

本文共 2420 字,大约阅读时间需要 8 分钟。

---恢复内容开始---

1 namespace 继承 2 { 3     public abstract class Animal 4     { 5         public abstract void ShowType(); 6         public void Eat() 7         { 8             Console.WriteLine("动物吃饭"); 9         10         }11     12     }13     public class Bird : Animal14     {15         private string type = "Bird";16         public override void ShowType()17         {18             Console.WriteLine("Type is {0}",type);19 20         }21         private string color="red";22         public string Color { get; set; }23     }24     public class Chicken : Bird25     {26        private string type = "Chicken";27        public override void ShowType()28         {29             Console.WriteLine("Type is {0}",type);30         }31         public void ShowColor()32         {33             Console.WriteLine("Color is {0}",Color);34         35         }36     37     }38     class Program39     {40         static void Main(string[] args)41         {42             Bird bird = new Bird();43             Chicken chicken = new Chicken();44            // Console.WriteLine(chicken.type);45             //Bird bird1 = new Chicken();46             //Console.WriteLine(bird1.type);47             //bird1.ShowType();48         }49     }50 }
View Code

对象创建时的内存分配

 在此我们以Chicken 对象的创建为例,首先是字段,对象一经创建,会首先找到其父类 Bird,并为

其字段分配存储空间,而Bird 也会继续找到其父类Animal,为其分配存储空间,依次类推直到递归
结束,也就是完成System.Object内存分配为止。

根据对象创建过程可见,可以明晰地了解创建对象时,内存的分配情况,与此同时,对继承的本质有了更明确的认识:

  • 继承是可传递的,子类是对父类的扩展,必须继承父类方法,同时可以添加新方法
  • 子类可以调用父类方法和字段,而父类不能调用子类方法和字段。
  • 虚方法如何实现覆写操作,使得父类指针可以指向子类成员
  • NEW关键字在虚方法继承中的阻断作用。

针对下面的对象创建问题,做了简单探索

Bird bird2 = new Chicken()

这种情况下,bird2.ShowType应该返回什么值呢?而bird2.type又该是什么值呢?

。net专门用于解决这些问题的二个原则:

  • 关注对象原则:调用子类还是父类的方法,取决于创建的对象是子类对象还是父类对象,而不是他的饮用对象。例如Bird bird2=new Chicken()时,我们关注是其创建对象为Chicken类型,因此子类将继承父类的字段和方法,或者覆写父类的虚方法,而不用关注bird2的引用类型是否为Bird。引用类型不同的区别决定了不同对象在方法表中的不同的访问权限。(注释),不同类型的指针只能在其特定的地址区域内进行执行,( //Bird bird1 = new Chicken();//Console.WriteLine(bird1.type);若将Bird,Chicken类中type字段的访问权限设置为Private时,很显然此时bird1.type是访问不到数据的;若改变Chicken类的type字段的访问权限设置为Public时,bird1.type是访问不到数据的,处于保护级别;父类类型访问不到子类的字段,可以访问到父类的属性,子类方法覆盖父类的方法时,此时对象调用的是子类的方法;否则,自动调用继承父类的方法.),子类覆盖父类时会保证其访问地址区域的一致性,从而解决了不同类型访问具有不同的访问权限问题。
  •  执行就近原则:对于同名字段或方法,编辑器是按照其顺序查找来引用,也就是首先访问离他创建最近的字段或者方法,例如上例中的bird2,是Bird类型,因此会首先访问Bird_type(注意编辑器是不会重新命名的,再次是为了区分),如果type类型设为Public,则在此将返回“Bird”值,这也就是为什么在对象创建时必须将字段按顺序排列,而父类要先于子类编译的原因了。

 参考链接:

---恢复内容结束---

转载于:https://www.cnblogs.com/meiCode/p/3360404.html

你可能感兴趣的文章
c数组指针与指针数组的区别
查看>>
通过loganalyzer 展示数据库中的日志
查看>>
Resource Manager资源管理器功能介绍
查看>>
引锁,重建任务
查看>>
ISP_BGP 理论知识
查看>>
Resin服务器平台介绍
查看>>
***CI异常记录到日志:CodeIgniter中设计一个全局exception hook
查看>>
财富第三极人类社会运行模型(附路线图)
查看>>
Exchange pipeline tracing(传输管道跟踪)
查看>>
中小型活动目录设计实例
查看>>
linux后缀名所对应的cpu
查看>>
[SQL]导出Oracle所有表结构,除数据外的所有内容
查看>>
bug-android之ActivityNotFoundException
查看>>
openfire集群
查看>>
Nginx服务基础到架构优化详解--常用25条
查看>>
SQLite 授权动作编码(AuthorizerAction Codes)
查看>>
提高编程技能最有效的方法(转载)
查看>>
day13:权限管理su/sudo及限制root用户登录
查看>>
yarn划分队列示例
查看>>
利用PHP获取一个页面上的链接信息
查看>>