zoukankan      html  css  js  c++  java
  • 深入浅出之继承机制(笔记一)

    谈到继承,不得不谈到封装。

    1.为什么会出现封装?

        如果我们把整个世界看成是由无数对象组成的大环境,那么,对象是指什么呢?其实际上指任何的一个东西,东西分门别类,比如:男人,女人,正方形,长方形,圆形等,我们为了描述一个对象,需要把对象的属性单独划分出来,这里对像的属性就是指类。属性包含固有的属性和一般的行为,比如:男人有性别,年龄等,这是固有的属性;同样男人可以工作等,这是行为;我们把这种固有的属性和行为在程序中表示就是成员变量和方法。所以封装是根据现实中的实际情况演化而来,只不过用语言去表达而已。

    2.为什么会出现private,protected,public修辞符。

        成员变量可以在本类中使用,也可以提供给外界使用。以数据封装的目的而言,前者较妥。但有时候不得不开放给外界使用,在这样的情况下就出现private,protected,public修辞符。也是后面我们要提到的派生类。

    3.基类与派生类

        

      

      注明:派生类与基类是iskindof的关系,那Ellipse是一种shape,Circle也是属于一种Ellipse等;

    我们将圆形,三角形,矩形等共有的东西抽像出来,形成基类,我们让基类做一件事情,可以设置yan色

    让派生类显示各自的信息。为了问题的说明,我们以Console为例演示:

    using System;
    using System.Collections.Generic;
    using System.Text;

    namespace ConsoleApplication1
    {
        class CShape
        {
            private int m_color;
            public void SetColor(int color)
            {
                m_color=color;
                Console.Write("您已经设置了:"+color+"颜色。");
            }
        }

        class CEllipse : CShape
        {
            public void Display()
            {
                Console.Write("这是椭圆。");
            }
        }

        class CRect : CShape
        {
            public void Display()
            {
                Console.Write("这是矩形。");
            }
        }

        class CTriangle : CShape
        {
            public void Display()
            {
                Console.Write("这是三角形。");
            }
        }


        class CCircle : CEllipse
        {
            public void Display()
            {
                Console.Write("这是圆。");
            }
        }

        class CSquare : CRect
        {
            public void Display()
            {
                Console.Write("这是正方形。");
            }
        }

       

        class Program
        {
            static void Main(string[] args)
            {
                //从以下测试可以看到:
                //1.所有派生类都暗自具备了基类的方法setcolor;
                //2.
                CSquare sq = new CSquare();
                CRect rect1 = new CRect();
                CRect rect2 = new CRect();
                CCircle circle = new CCircle();
                sq.SetColor(1);
                rect1.SetColor(21);
                rect2.SetColor(22);
                circle.SetColor(3);
                Console.Read();

               


            }
        }
    }

    通过以上,我们可以弄清楚:

      1.每个派生类都拥有暗属性和方法,即属性和方法在派生类本身中没有体现,是基类的,所以我们称暗属性和方法。

      2.rect1和rect2是两个不同的对象,各有自己的成员变量m_color,但却有共享的一个方法setcolor,实际上是基类的setcolor,如图所示:

      3.即然所有的类都有相同的方法display(),我们能提到基类中吗?不能,因为display应该因不同的情状而有所变化。

      4.形状类我们能实例化吗?形状是一种抽象的东东,世界上并没有形状这种东东,语言是从生活中来的,所以形状类我们不能进行实例化,因为没意义。这也说明了把display()方法放到基类中不适合。。这也是为什么我们后面要谈到的抽象类不能实例化的原理。

      5.我们看到了,几乎每个派生类中都有display(),我能否把它放到基类中,至于派生类想实现什么样都可由派生类自己决定呢?答案是:可以,这就是虚函数。下一章节我们继续,如果大家觉得有什么意见或建议,请即时留言。

       

     

      调用C#类的成员函数的时候,编译器有没有插入this指针作为参数(如同C++一样)?  
      没有插入,原因很简单.C++是基于源代码级别的OOPL,也就是说编译后的依然是二进制代码  
      而C#是在CRL阶段就支持OOPL的.C#编译后的IL你可以看的到,它是被编译成Assembly  
      每个Assembly是自描述,所以不需要.  
       
       
      >>如果没有,它是怎样实现的。  
      matedata   元数据,实现的,因为可以自描述 ,其元数据也是存储在Assembly中,关于元数据,Assembly,反射我将专门抽一个章节来讲述。(等这个系列讲完后)

  • 相关阅读:
    JDBC事务处理
    JDBC之LOB数据类型
    使用JDBC驱动程序处理元数据
    JDBC之PreparedStatement
    JDBC主要API学习总结
    JDBC简介
    ForkJoinPool 分支/合并框架
    线程池
    线程八锁
    jQuery中的事件冒泡
  • 原文地址:https://www.cnblogs.com/chuncn/p/1399898.html
Copyright © 2011-2022 走看看