云顶娱乐平台:c#继承类实例

C#中的base关键字代表基类,使用base关键字可以调用基类的构造函数、属性和方法。

  • 调用基类上已被其他方法重写的方法。
  • 指定创建派生类实例时应调用的基类构造函数。

       这点跟有参数的构造函数很相似,有参数的构造函数也是这样执行的。但是无参数的构造函数是隐式执行的,而有参数的构造函数需要显示使用Base关键字来调用基类的构造函数。

namespace InheritanceApplication
{
   class Shape 
   {
      public void setWidth(int w)
      {
         width = w;
      }
      public void setHeight(int h)
      {
         height = h;
      }
      protected int width;
      protected int height;
   }

   // 派生类
   class Rectangle: Shape
   {
      public int getArea()
      { 
         return (width * height); 
      }
   }

   class RectangleTester
   {
      static void Main(string[] args)
      {
         Rectangle Rect = new Rectangle();

         Rect.setWidth(5);
         Rect.setHeight(7);

         // 打印对象的面积
         Console.WriteLine("总面积: {0}",  Rect.getArea());
         Console.ReadKey();
      }
   }
}
Private:只有类本身能存取.
Protected:类和派生类可以存取.
Internal:只有同一个项目中的类可以存取.
Protected Internal:是Protected和Internal的结合. 
Public:完全存取.

      
类型的成员或者是在该类型中声明的,或者是从该类型的基类“继承”的。当类型从基类继承时,基类的所有成员(实例构造函数、析构函数和静态构造函数除外)都成为派生类型的成员。*基类中关于成员的可访问性的声明不能控制该成员是否可继承:继承性适用于任何成员,只要它们不是实例构造函数、静态构造函数或析构函数。*然而,在派生类中可能不能访问已被继承的成员,原因或者是因为其已声明可访问性,或者是因为它已被类型本身中的声明所隐藏。

在现有类(基类、父类)上建立新类(派生类、子类)的处理过程称为继承。派生类能自动获得基类的除了构造函数和析构函数以外的所有成员,可以在派生类中添加新的属性和方法扩展其功能。

一、封装:
  封装是实现面向对象程序设计的第一步,封装就是将数据或函数等集合在一个个的单元中(我们称之为类)。被封装的对象通常被称为抽象数据类型。

        派生类继承基类的所有成员(除构造函数和析构函数),new用来隐藏基类成员,override用来重写基类成员方法。然而隐藏和重写都不能改变一个事实:

 

封装的意义:
  封装的意义在于保护或者防止代码(数据)被我们无意中破坏。在面向对象程序设计中数据被看作是一个中心的元素并且和使用它的函数结合的很密切,从而保护它不被其它的函数意外的修改。

        定义一个类从其他类派生的时候,派生类隐式获得基类的除构造函数和析构函数以外的所有成员。所以派生类可以重用基类中的代码而无需重新实现。然后在派生类中添加新成员,来扩展基类的功能。

可传递性:C从B派生,B从A派生,那么C不仅继承B也继承A。

封装提供了一个有效的途径来保护数据不被意外的破坏。相比我们将数据(用域来实现)在程序中定义为公用的(public)我们将它们(fields)定义为私有的(privat)在很多方面会更好。私有的数据可以用两种方式来间接的控制。第一种方法,我们使用传统的存、取方法。第二种方法我们用属性(property)。

        前面都是直接从msdn上抄过来的,对于构造函数能不能继承这一点感觉到很疑惑。在之前的理解中,一直以为构造函数是可以继承的,因为在实际操作中,把派生类中的默认构造函数删除掉的话,派生类也可以使用基类中的默认构造函数实例化。结果错误的以为这是继承。我想应该会有很多新手在学习继承的时候也会陷入这样的误区。所以在这里把自己的理解写一哈,希望能帮助到需要的人,再一个希望有大神看看我的理解有没有错。

继承的特性:

使用属性不仅可以控制存取数据的合法性,同时也提供了“读写”、“只读”、“只写”灵活的操作方法。

       
继承是面向对象编程的三个主要特征之一。继承用于创建可重用、扩展和修改在其他类中定义的行为的新类。派生类只能有一个直接基类(结构不支持继承,但可以实现接口)继承是可以传递的。

单一性:只能从一个基类中继承,不能同时继承多个基类继承中的访问修饰符base和this关键字基类的构造函数和析构函数不能被继承的。但可以使用关键字base来继承基类的构造函数。

三、多态
  1、多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。
  编译时的多态性:
  编译时的多态性是通过重载来实现的。对于非虚的成员来说,系统在编译时,根据传递的参数、返回的类型等信息决定实现何种操作。
  运行时的多态性:
  运行时的多态性就是指直到系统运行时,才根据实际情况决定实现何种操作。C#中,运行时的多态性通过虚成员实现。
  编译时的多态性为我们提供了运行速度快的特点,而运行时的多态性则带来了高度灵活和抽象的特点。
  2、实现多态:
接口多态性。
继承多态性。
通过抽象类实现的多态性。
  3、override关键字:
   重写父类中的virtual修饰的方法,实现多态。

基类的所有成员(实例构造函数、析构函数和静态构造函数除外)在派生类中一个也不能少。

访问修饰符:

      
实际上,我之前是把构造函数继承和调用搞混了。继承是一种关系,调用是一种行为。有继承关系的类的默认构造函数在调用的时候,总是先从基类开始,然后一层一层执行下去。比如说C类继承于B类,B类继承于A类。那么C类在使用没有参数的构造函数的时候,就会先从A类中的构造函数执行,然后执行B类中的构造函数,再执行C类中的构造函数。当基类没有构造函数,派生类也没有构造函数的时候,派生类新增成员的初始化工作由其他公有的函数来完成。如果派生类的基类也是派生类,则每个派生类只需负责其直接基类的构造,不负责间接基类的构造。

二、继承:继承主要实现重用代码,节省开发时间。
1、C#中的继承符合下列规则:
继承是可传递的。如果C从B中派生,B又从A中派生,那么C不仅继承了B中声明的成员,同样也继承了A中的成员。Object类作为所有类的基类。
派生类应当是对基类的扩展。派生类可以添加新的成员,但不能除去已经继承的成员的定义。
构造函数和析构函数不能被继承。除此之外的其它成员,不论对它们定义了怎样的访问方式,都能被继承。基类中成员的访问方式只能决定派生类能否访问它们。
派生类如果定义了与继承而来的成员同名的新成员,就可以覆盖已继承的成员。但这并不因为这派生类删除了这些成员,只是不能再访问这些成员。
类可以定义虚文法、虚属性以及虚索引指示器,它的派生类能够重载这些成员,从而实现类可以展示出多态性。
2、new关键字
云顶娱乐平台,   如果父类中声明了一个没有friend修饰的protected或public方法,子类中也声明了同名的方法。则用new可以隐藏父类中的方法。(不建议使用)
3、base关键字
   base 关键字用于从派生类中访问基类的成员: