zoukankan      html  css  js  c++  java
  • [Objectoriented] : 继承

    前言 :

    继承
    是面向对象初学者,学完之后。觉得懂却又有点模糊的东西
    笔者试着用展开程序代码的方式,来解释继承的运作。

    继承 :

    底下是一段继承的程序代码
    这个程序代码很简单,就是ClassB继承ClassA而已

    namespace ConsoleApplication1 
    { 
        public class ClassA
        {
            public void XXX()
            {
                // ClassA Code
            }
    
            private void YYY()
            {
                // ClassA Code
            }
    
            protected void ZZZ()
            {
                // ClassA Code
            }
        }
    
        public class ClassB : ClassA
        {
            public void AAA()
            {
                // ClassB Code
            }
        }	
    }

    我们在理解上,可以将这段程序代码展开成这样

    namespace ConsoleApplication1 
    { 
        public class ClassA
        {
            public void XXX()
            {
                // ClassA Code
            }
    
            private void YYY()
            {
                // ClassA Code
            }
    
            protected void ZZZ()
            {
                // ClassA Code
            }
        }
    
        public class ClassB : ClassA
        {
            private ClassA base = new ClassA();
    
            public void XXX()
            {
                base.XXX();
            }
    
            protected void ZZZ()
            {
                base.ZZZ();
            }
    
            public void AAA()
            {
                // ClassB Code
            }
        }
    }

    当我们使用了继承的语法,ClassB继承ClassA的时候
    我们可以看成编译程序的动作为:
    1. 保留ClassB内的所有成员。
    2. 在ClassB内建立一个名为base的ClassA对象。
    3. 把ClassA内所有不是标示为private的所有成员,展开成为ClassB的成员。
    4. 在ClassB展开的成员内,全部设订为呼叫ClassA的成员。

    这样的思路看下来,
    应该就可以理解继承,是如何的运作。

    存取修饰词 :

    这边再来说明继承会使用到的存取修饰词:public、protected、private

    当ClassA内的成员:
    宣告为public,   展开程序代码的时候:展开成为ClassB的 public成员。
    宣告为protected,展开程序代码的时候:展开成为ClassB的 protected成员。
    宣告为private,  展开程序代码的时候:不作任何的动作。

    当我们针对类别成员使用不同的存取修饰词,对于延生的类别而言,会产生不同的影响。

    覆写 :

    最后再来说一个覆写好了
    当我们写了这样一段程序代码

    namespace ConsoleApplication1 
    { 
        public class ClassC
        {
            public virtual void XXX()
            {
                // ClassC Code
            }
    
            public virtual void YYY()
            {
                // ClassC Code
            }
        }
    
        public class ClassD : ClassC
        {
            public override void XXX()
            {
                // ClassD Code
            }
        }
    }

    我们在理解上,可以将这段程序代码展开成这样

    namespace ConsoleApplication1 
    { 
        public class ClassC
        {
            public virtual void XXX()
            {
                // ClassC Code
            }
    
            public virtual void YYY()
            {
                // ClassC Code
            }
        }
    
        public class ClassD : ClassC
        {
            private ClassC base = new ClassC();
    
            public virtual void XXX()
            {
                // ClassD Code
            }
     
            public virtual void YYY()
            {
                base.YYY();
            }
        }
    }

    这段程序代码跟之前范例不同的地方在于多了virtual及override的宣告。
    当我们宣告类别成员为virtual的时候,
    就代表衍生的子类别,可以覆写这个成员。

    当子类别使用override关键词覆写成员的时候
    程序代码展开的规则,不会呼叫base的成员,
    而是执行子类别撰写的程序代码。(如上面范例的 XXX())

    当然啦~ 子类别也可以选择不覆写父类别的成员。
    程序代码展开的规则就跟一般的成员一样,
    会呼叫父类别的成员。(如上面范例的 YYY())

    后记 :

    本篇的文章,
    描述了继承的运作,希望对大家有帮助^^

    P.S.
    本篇的内容大幅度的简化了计算器结构的内容,用以传达面向对象的概念。
    实际计算机系统在运作的时候,比本篇说明的复杂很多 ^^"。

  • 相关阅读:
    设备像素比devicePixelRatio简单介绍
    详解事件代理委托
    原生dom事件注册和移除事件的封装
    idataway_前端代码规范
    170307、1分钟实现“延迟消息”功能
    170306、wamp中的Apache开启gzip压缩提高网站的响应速度
    170303、PHP微信公众平台开发接口 SDK完整版
    170302、 Apache 使用localhost(127.0.0.1)可以访问,使用本机局域网IP(192.168.2.*)不能访问
    170301、使用Spring AOP实现MySQL数据库读写分离案例分析
    170228、Linux操作系统安装ELK stack日志管理系统--(1)Logstash和Filebeat的安装与使用
  • 原文地址:https://www.cnblogs.com/clark159/p/2205020.html
Copyright © 2011-2022 走看看