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

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,反射我将专门抽一个章节来讲述。(等这个系列讲完后)

 

 

  

posted on 2009-02-19 19:21  jasonM  阅读(221)  评论(0编辑  收藏  举报