代码改变世界

《C#本质论》读书笔记(十一)面向对象编程之继承 @ Lennon

2010-07-30 16:04  张抗  阅读(529)  评论(1)    收藏  举报

        在面向对象编程中,所有结构化编程构造仍然适用。然而,将那些构造封装在类中,可以创建更大、更有条理以及更容易维护的程序。从结构化的、基于控制流的程序转向面向对象的程序,是思维模式发生的一个根本性变化,因为面向对象编程提供了一个额外的组织层次。结果是较小的程序在某种程度上得到了简化。更重要的是,你现在有能力创建更大的程序,因为那些程序中的代码得到了更好的组织。

        面向对象编程的关键优势之一是不需要完全从头创建新的程序。相反,可以将现有的一系列对象组装到一起,用新的功能来扩展类,添加更多的类,然后将一切都重新组装起来,以提供新的功能。

     继承的概念?

     继承是面向对象编程最重要的特性之一。任何类都可以从另外一个类继承,这就是说,这个类拥有它继承的类的所有成员。在面向对象编程中,被继承的类称为父类或基类。在C#中提供了类的继承机制,但只支持单继承,而不支持多重继承,即在C#中一次只允许继承一个类,不能同时继承多个类。
利用类的继承机制,用户可以通过增加、修改或替换类中的方法对这个类进行扩充,以适应不同的应用要求。利用继承,程序开发人员可以在已有类的基础上构造新类,这一性质使得类支持分类的概念。在日常生活中很多东西都很有条理,那是因为它们有着很好的层次分类。如果不用层次分类,则需要对每个对象都定义其所有的性质。使用继承后,每个对象就可以只定义自己的特殊性质,每一层的对象只需定义本身的性质,其他性质可以从上一层继承下来。
继承一个类时,成员的可访问性是一个重要的问题。子类不能访问基类的私有成员,但是可以访问其公共成员。这就是说,只要使用public声明成员,就可以让一个成员被基类和子类访问,同时也可以被外部的代码访问。
为了解决基类成员访问问题,C#还提供了另外一种可访问性——protected,只有派生类才能访问protected成员,基类和外部代码都不能访问protected成员。

 

    继承的特性?

     一、继承的传递性

     派生类从基类那里继承特性。派生类也可以作为其它类的基类。从一个基类派生出来的多层类形成了类的层次结构。就像现在中爷爷,爸爸和儿子的关系。儿子不仅可以访问父类爸爸的所有公有属性方法,也可以访问爷爷的所有公有属性和方法,这种关系称为继承传递性。

      二、继承的单一性

      继承的单一性是指子类只能继承一个父类,不能同时继承多个父类。C#中,派生类只能从一个类中继承。C#不支持多重继承,也就是说,儿子只能有一个亲生父亲,不能同时拥有多个亲生父亲。C#中使用接口技术实现多重继承。

 

     

     C#中的继承符合那些规则?

      1、继承是可传递的。如果C从B中派生,B又从A中派生,那么C不仅继承了B中声明的成员,同样也继承了A中的成员。Object 类作为所有类的基类。

      2、派生类应当是对基类的扩展。派生类可以添加新的成员,但不能除去已经继承的成员的定义。

      3、构造函数和析构函数不能被继承。除此以外的其它成员,不论对它们定义了怎样的访问方式,都能被继承。基类中成员的访问方式只能决定派生类能否访问它们。

      4、派生类如果定义了与继承而来的成员同名的新成员,就可以覆盖已继承的成员。但这并不因为这派生类删除了这些成员,只是不能再访问这些成员。

      5、类可以定义虚方法、虚属性以及虚索引指示器,它的派生类能够重载这些成员,从而实现类可以展示出多态性。

      6、派生类只能从一个类中继承,可以通过接口实现多重继承。

 

 

       继承是面向对象程序设计的主要特征之一,它可以让您重用代码,可以节省程序设计的时间。继承就是在类之间建立一种相交关系,使得新定义的派生类的实例可以继承已有的基类的特征和能力,而且可以加入新的特性或者是修改已有的特性建立起类的新层次。

       C#中,派生类从它的直接基类中继承成员:方法、域、属性、事件、索引指示器。除了构造函数和析构函数,派生类隐式地继承了直接基类的所有成员。

       

代码
using System ;
class Vehicle //定义交通工具(汽车)类
{
protected int wheels ; //公有成员:轮子个数
protected float weight ; //保护成员:重量
public Vehicle( ){;}
public Vehicle(int w,float g){
wheels
= w ;
weight
= g ;
}
public void Speak( ){
Console.WriteLine(
"交通工具的轮子个数是可以变化的! " ) ;
}
} ;
class Car:Vehicle //定义轿车类:从汽车类中继承
{
int passengers ; //私有成员:乘客数
public Car(int w , float g , int p) : base(w, g)
{
wheels
= w ;
weight
= g ;
passengers
=p ;
}
}