黑马程序员----面向对象设计的封装、继承、多态特性
1.面向对象设计
面向对象程序设计是在面向过程程序设计的基础上发展而来的,他将数据和对数据的操作看作一个不可分割的整体,力求将现实问题简单化,因为这样不仅符合人们的思维习惯,同时也提高软件的开发效率,并方便后期的维护。
1.1面向对象编程(Object-Oriented Programming)简称OOP技术,是开发应用程序的一种新方法、新思想。使用OOP技术,会使用很多代码模块,每个模块都只能提供特定的功能,它们是彼此独立的,这样提高了代码的重用率。
1.2对象和程序的关系
对象=算法+数据结构
程序=对象+对象+对象+……
从上面的等式可以看出,程序就是许多对象在计算中相继表现自己,而对象则是一个个的程序实体。
1.3面向对象的三个基本特性:
1)封装性:类是属性和方法的集合,为了实现某项功能而定义类,但开发人员并不需要了解类体内每句代码的具体含义,只需通过对象来调用类内某个属性或方法即可实现某项功能。
2)继承性:通过继承可以创建子类和父类之间的层次关系,子类可以从父类中继承属性和方法。
3) 多态性:是指不同的类进行同一操作可以有不同行为。
2.创建类与类的成员
2.1创建类
类修饰符 class 类名
{
public int number;
public string color;//定义属性
//定义方法
}
常用的类修饰符
1) public:不限制对该类的访问。
2) protected:只能从其所在类和所在类的子类进行访问。
3) internal:只有其所在类才能访问。
4) private:只有.NET中的应用程序或库才能访问。
5) abstract:抽象类,不允许建立类的实例。
6) sealed:密封类,不允许被继承。
2.2构造函数与析构函数
1) 构造函数:是在创建给定类的对象时执行的类方法。构造函数具有与类相同的名称,通常用于初始化新对象的数据成员。
例如:
public class Program
{
public int x;
public int y;
public int z;
//构造函数
public Program()
{
z=x+y;
}
static void Main(string[] args)
{
Program pro=new Program();
Console.WriteLine(“结果为:”+pro.z);
Console.ReadKey();
}
2) 析构函数
析构函数是以类名加“~”来命名的。当某个类的实例被认为是不再有效,并符合析构条件时,.NET Framework类库的垃圾回收功能就会调用该类的析构函数实现垃圾回收。
2.3实例化对象
Program pro=new Program();
通过使用new关键字,创建类的对象。
2.4定义成员字段、方法、属性
public class MyClass
{
public int myField;//字段声明
public void Method()
{
//在方法中编写代码
}
//属性定义
public int MyField
{
get{
return myField;
}
set{
myField=value;
}
}
}
3封装、继承、多态
3.1封装:面向对象编程中,大多数都是一类作为数据封装的基本单位。类将数据和操作数据的方法结合成一个单位。设计类时不希望直接存取类中的数据,而是希望通过方法来存取数据,这样就可以达到封装数据的目的,方便以后的维护升级,也可以在操作数据时多一层判断。此外,封装还可以解决数据存取的权限问题,可以使用封装数据隐藏起来,形成一个封闭的空间。
3.2继承:及城市面向对象编程最重要的特征之一。任何类都可以从另外一个类继承,这就是说,这个类拥有它继承的类的所有成员。在面向对象编程中,被继承的垒成为父类或基类。C#中提供了类的继承特性,但只支持单继承,而不支持多重继承,即在C#中一次只允许继承一个类,不能同时继承多个类。
利用类的继承机制,用户可以通过增加、修改或替换类中的方法对这个类进行扩充,以适应不同的应用要求。利用继承,程序开发人员可以在已有类的基础上构造新类。继承一个类时,类成员的访问性是一个重要问题。子类不能访问基类的私有成员,但是可以访问其公共成员。只要是public声明类成员,就可以让一个类成员被基类成员和子类同时访问,同时可以被外部的代码访问。C#还提供了protected访问:只有子类才能访问protected成员。另外,基类的成员可以是虚拟的,该虚拟的成员可以被派生类重写。基类也可以定义为抽象类。抽象类不能直接实例化,要使用抽象类就必须继承这个类,然后再实例化。
3.21继承的实现
语法格式如下:
class DerivedClass :BaseClass//继承类,子类和基类之间用冒号
{
//子类新加成员
}
3.22单继承
单继承一般用于在类之间的继承,实现单继承时,使用“子类:基类”格式。另外在子类中重写基类的虚方法时,可以使用base关键字调用基类中的虚方法。如果要使用多重继承,需要使用接口,接口支持多重继承,实现多重继承时,继承的接口中间用逗号隔开。
例如:class Program:MyClass,IPeople//用逗号隔开,多重继承
{
//新增成员、实现接口中方法等
}
3.3多态
3.31多态的定义:
可以概括为:“一个接口,多种方法”,它是在程序运行过程中才调用的方法,多态性是面向对象编程的核心概念。多态使得子类的实例可以直接赋予基类的变量,然后就可以直接通过这个变量调用子类的方法。
那么多态性到底有什么用呢?封装可以隐藏细节,使得代码模块化;继承可以扩展已经存在的代码模块,它们的目的都是为了代码重用;而多态则是为了实现另一个目的---接口重用。因为接口是最浪费时间资源,实质上设计一个接口要比设计一堆类要显得更有效率。
3.32多态的实现
1)类的多态性是通过在子类中重写基类的虚方法或成员函数来实现的。
2)当子类从基类继承时,它会获得基类的所有方法、字段、属性和事件。要更改基类的数据和行为有两种选择:
a、可以使用新的派生成员代替基成员,需使用new关键字。如果要在子类中创建与基类相同的方法、字段或属性,则使用new关键字创建该方法、字段或属性的新定义。new关键字放置在要替换的类成员的返回类型之前。
b、重写虚拟的基成员。子类可以重写基类中用virtual修饰的类方法。在子类中要使用override关键字,放置在返回类型之前。
注意:virtual修饰符不能与private、static、abstract或者override修饰符同时使用。
override修饰符不能与new、static或者virtual修饰符同时使用,并且重写方法只能用于重写基类中的虚方法。
在C#中,继承、虚方法和重写方法组合在一起才能实现多态性。