面向对象编程OOP(Object-Oriented Programming)
2016.12.16:给大家推荐一个视频教程 http://study.163.com/course/courseMain.htm?courseId=214019 传智博客的一个讲解面向对象的视频,讲解浅显易懂,课时还少,一下午就可以看完。大家可以去看一看,先理解个大概就能看明白了。
2017.3.22:昨天在学校借了一本c#图解教程,感觉对类的讲解更加详细直观。重新修改一遍文章,顺便也总结一下自己的认知。之前推荐大家用现实中的东西来理解类,其实这样是不好的,就按照程序里的概念去理解就好。只要学习一下三层写个多层的程序就可以对类有一定的理解。
面向对象的三个主要特征:封装、继承、多态。
封装具体的表现是类,类是将具有相同特征的事物封装在一起,
存储的是一类事物的属性及方法;对象是类的具体实现,
表示的是一个具体的事物;
类(Class)
类是对象的定义,对象是类的实现。
类成员:字段,常量,方法,属性,构造函数,析构函数,运算符,索引,事件。
类成员:由两部分组成,一部分是以类成员声明形式引入的类成员,另一部分是直接从它基类继承而来的成员。
类成员声明主要包括常数声明,字段声明,方法声明,属性声明,事件声明,构造函数声明,析构函数声明等。
当字段,方法,属性,事件,运算符,和构造声明中含有static修饰符时,表明是静态成员,不能实例化。
[属性集信息] [类修饰符] class 类名 [:类基] //定义类的语法格式,方括号可省略,类修饰符默认为public,隐含基类默认为object
{类成员}
部分类修饰符:
public:完全可访问。
internal:在本程序集中可访问。
abstract:抽象类,含有抽象成员,不能被实例化,只能做基类。
sealed:密封类,不能再派生出其他类。
部分类成员修饰符:
private:只能被自身类的成员访问。不能被其他类访问,包括继承它的类。
protected:只能被本类及本类的子类(派生类)访问,程序集外部继承也可以访问。
internal:对本程序集内部所有类可访问。
protected internal:对所有继承本类的类以及所有本程序集内部所有类可访问。
public:完全可访问。
abstract:抽象成员。
sealed:密封成员。
类基:定义该类的直接基类和由该类实现的接口。
部分类成员访问修饰符:private/protected/internal/public 同上
常数声明:常数表达式的值应该是一个可以在编译时计算的值,不允许使用static修饰符,但他和静态成员一样,只能通过类访问。
[属性集信息] [访问修饰符] const 类性 标识符 = 常数表达式[] //方括号可省略,类修饰符默认为public,隐含基类默认为object
字段声明:变量声明列表可以用逗号来分隔多个变量,并且变量标识符还可以用赋值号设定初始值。字段其实就是声明一个变量。
静态字段:静态字段被类的所有实例共享,所有实例访问内存同一位置。因此被某个实例改变后这种改变对所有实例都可见。
可用readonly修饰符,表示只读字段。只读字段可以在定义时或构造函数时赋值,它的值不能在编译时确定,只能在运行时确定。
常量只能在定义时赋值,常量值在编译时已经确定,在程序中不能确定。
[属性集信息] [访问修饰符] 类性 变量声明列表 //方括号可省略,字段的默认修饰符为private,
构造函数和析构函数:是类中比较特殊的两种类,分别用来对对象进行性初始化和回收对象资源。
不写构造函数,默认有一个没有参数的构造函数。
如果一个类含有构造函数,在实例化该类的对象时就会调用,如果含有析构函数则会在销毁对象时调用。
构造函数的名字与类名相同,析构函数的名字与构造函数形同,析构函数名字前面要加一个波浪号。
构造函数:无返回值,连void都不需要,方法名必须是类名,如无构造函数则系统默认一个无参构造函数,可定义多个构造函数(重载:参数类型不同,个数不同,顺序不同),静态属性。
静态构造函数:类只能有一个静态构造函数,不能有参数,不能带有访问修饰符。不能显式的调用静态构造函数,系统会自动调用其在类的任何实例被创建前,类的任何静态成员被引用前。
public 类名(){}
~类名(){}
属性:属性的主要用途是限制外部类对类中成员的访问权限,定义在类级别上。
使用属性看起来非常像写入或读取一个字段,但是其实是调用的方法。
属性不分配内存,字段分配内存。
属性可以忽略get或set访问器,但是不能两个都忽略。
get方法没有参数;set方法有一个隐含的参数value。
[属性集信息] [访问修饰符] 类性 属性名
{
get{}
set{}
}
抽象类:关键字(abstract)
索引器:使用索引器会让是用实例的字段数组一样。索引器是一组get set访问器,与属性类似。
和属性一样,索引器不用分配内存来存储。属性通常表示单个的数据成员,索引器表示多个。
索引器没有名称,在名称的位置是this。
1 [属性集信息] [访问修饰符] 类形 this [int index//参数列表] 2 { 3 set{ 4 switch(index){ 5 case 0:某字段=value;break; 6 } 7 } 8 get{ 9 switch(index){ 10 case 0:return 某字段; 11 } 12 } 13 }
多态(Polymorphism)
按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。引用Charlie Calverts对多态的描述——多态性是允许你将父对象设置成为一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作(摘自“Delphi4 编程技术内幕”)。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。多态性在Object Pascal和C++中都是通过虚函数实现的。
继承
一个类继承另一个类中的成员,被继承的叫做基类,继承类叫做派生类,派生类扩展他的基类,它包含了基类的成员,加上他本身声明中的新增功能。
派生类继承了基类的所有成员,这意味着实例化的派生类可以调用基类的方法。
除了特殊的类obiect,所有的类都是派生类,即使他们没有基类规格说明,即使他们没有基类声明。没有基类声明的类隐式的直接派生自object。
一个类的基类声明中只能有一个单独的类,这称为单继承,虽然类只能直接继承一个类,但继承层次没有限制。
屏蔽基类成员:在派生类中使用new关键字声明新的带有签名(签名由名称和参数列表组成,不包括返回类型)的函数成员(执行代码的成员)来屏蔽基类成员。
基类访问:如果派生类必须完全的访问被隐藏的继承成员,可以使用关键字 base 后面跟着一个 . 和成员的名称组成。
虚方法和覆写方法:虚方法可以使基类调用派生类的方法,只需满足三个条件。
①派生类方法和基类方法有相同签名和返回类型。
②基类方法使用 virtual 标注。
③派生类方法使用 override 标注。
使用 override 标识方法在最高级派生类(派生出的最后一个类)中就会覆写所有类中的该方法。
基类中使用 virtual 标注。
继承中的构造函数:继承层次链中的每个类在执行它自己的够赞函数之前执行基类的构造函数。
抽象成员:
抽象成员只能在抽象类中声明。
abstract public void xxxx (string s);
①必须是函数成员(不为字段常量)
②必须使用 abstract 修饰符标记。
③不能有代码块,使用分号表示。
④类似虚成员,在派生类中必须覆写,使用 override 标注。
抽象类:
抽象类就是指被设计为被继承的类,抽象类只能被用作其他类的基类。
抽象类不能创建实例,使用 abstract 修饰符标记。
抽象类可以包含抽象成员或普通非抽象成员。
抽象类可以派生自另一个抽象类。
任何派生自抽象类的类必须使用 override 实现该类所有的抽象成员,除非派生类也是抽象类。
密封类:
抽象类必须用作基类,它不能被实例化,密封类与它正好相反。
密封类只能被用做独立的类,不能被用作基类。
密封类使用 sealed 修饰符标注。
静态类:
静态类中的所有成员都是静态的。
静态类用于存放不受实例数据影响的数据和函数,静态类的常见用途就是创造一个包含一组数学方法和值得数学库。
①静态类本身必须标记为 static 。
②静态类的所有成员必须是静态的。
③静态类可以有一个静态够咱函数。但不能有实例构造函数,不能创建该类实例。
④静态类不能被继承。
一个栗子:
类:所有的桌子
对象:一个桌子
属性:桌子的款式,桌子的高度,桌子材质
方法:放书,当材火烧,可以伸缩大小
封装:定义了桌子类,有材质这个属性,把(逻辑处理)封装起来,只留接口访问。
这个桌子,该暴露什么,不该暴露什么,由类的设计中觉得,private属性用户不能直接访问,如果提供了接口访问材质这个属性,那么可以修改这个属性的值
通过方法修改属性和直接修改属性的区别:是方法修改属性可以做限制,如果不良商人用垃圾木头做桌子呢。那么这个方法就可以做限制。
继承:一个对象(桌子),有某个方法(伸缩),另一个对象(桌子)刚好没有,最简单的就是另外一个继承这个伸缩方法
多态:一个对象(桌子),每个桌子都有相同的方法(放东西),但有的放电脑,有的放书。这就是多态
转载请标明出处