第十一章:类的面对对象编程
封装性
1.面对对象的编程中,大多数情况都是以类作为数据封装的基本单位,封装的类中包含数据和对此数据的操作即算法。
2.类具有清晰的对外接口。
3.类中不想被外部更改的变量通过私有来实现。即封装
继承性
1.C#中只支持单继承,一次只能继承一个类,不能继承多个类,即一个类不能够同时获得多个类的特性。
2.子类继承父类后,并不能拥有父亲的私类成员。子类除了有父类的特性外,还可以有自己的特性。子类可以用自己的方式实现父类的方法即方法重写
3.enum 数据类型,枚举类型
4.耦合性
5.基类可以定义为抽象类,抽象类不能直接实例化,如果要使用抽象类,就必须继承这个类,然后进行实例化操作。另外,继承类时,需要使用冒号加类名,当对一个类应用sealed修饰符修饰时,该修饰符会阻止其他类从该类继承。
6.派生类不仅扩展了基类,并且继承也是可以传递的。例如现在C类继承自B类,B类又继承至A类,则C类继承A类和B类中的所有成员。
7.一个类派生于另一个基类,则其拥有这个基类多有的成员字段和函数。
8.Object类是其他所有类的共同基类,也是唯一的非派生类。
9.隐藏方法,我们不能删除基类中的任何成员,但是可以用与基类成员名称相同的成员来屏蔽基类成员。即基类继承父类中所有方法,可以用隐藏方法来隐藏父类已有方法,定义子类中的特有方法。
pub;ic class Pet//父类
{
Public string name;
public void PrintName();
}
public class Dog:Pet//子类
{
new public void PrintName();//这是定义与父类函数签名相同的方法,这个方法屏蔽了父类中同签名的方法。
}
多态性
1.同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果就是多态。即针对父类的一些成员,子类继承后去重写,从而实现不同的功能
2.编译时多态需要通过重载来完成,重载是指同一个类中有多个名字相同但是但是使用的参数类型、个数或顺序不同。重载是一种编译时的多态
3.运行时的多态,通过override修饰符是指子类对父类中虚方法或抽象方法的覆盖。通过new实现运行时的多态,这种情况称为覆盖,覆盖指不同类中有两个或多个返回类型、方法名、参数都相同而方法体不同的方法。这种覆盖只是表面上的覆盖,被覆盖的父类方法是可以调用到的。
4.重载和重写:重写是父类和子类之间多态性的一种表现,重载是一个类中多态性的表现。
5.基类和派生类
父类即派生类,子类即基类
6.base关键字
用于表示父类,通过它可以访问父类的成员
如果说你父类里面有一个成员比如int a;那么你子类里面也可以再定义一个int a,
这个时候base.a和this.a表示的就不是一个变量了,如果说子类里面没有,
那么base.a和this.a表示的都是一个变量
还有就是重写,覆盖和构造函数里面调用父类的这个方法。可以用:base(),
还有就是关于形参名和成员变量相同的时候,
因为是就近原则,所以直接写变量名字表示的就是形参,如果加了this表示的就是这个类的成员。
C#里面的this和base 跟JAVA里面的this和super是一样的。
你在定义一个变量的时候有一个this引用,指向自身,还有一个引用base,指向父类。
关于你说的那种情况就是我说的第一种,如果子类成员有和父类成员同名的时候,就必须用this和base区分
7.密封类:sealed
密封了某个类,则其他类不能从该类继承,密封了某个成员,则派生类不能重写该成员的实现。密封类不能作为基类被继承,但是它可以继承别的类或接口。
密封方法:sealed override
当实例方法声明包含sealed修饰符时,称方法为密封方法。并不是每个方法都可以声明为密封方法,密封方法只能用于对基类的虚方法进行实现,并提供具体的实现。因此声明密封方法时,sealed修饰符总是和override修饰符同时使用。
密封类除了不能被继承之外,其他方面与非密封类的用法大致相同。而密封方法必须通过重写基类中的虚方法进行实现。
8.类中的常用关键字:
base:base和this一样,都是作为类的实例(因此不能调用基类的静态成员和抽象成员)简写或者替代存在的,this用于替代本类的实例,base关键字用于替代基类的实例。
(1)调用基类已经被派生类重写的方法base.方法名()
(2)指定派生类实例时调用基类的构造函数
virtual:修饰方法、属性、索引器或事件声明,声明虚方法和虚属性并使他们可以在派生类中重写。虚拟成员的实现可由派生类中的重写成员更改,而非虚拟成员是无法由派生类进行重写的。
虚方法和抽象方法都可以提供派生类的重写,他们之间的区别:P261
ref和out:C#中通过使用方法来获取方法的返回值时,通常只能得到一个返回值。因此若要一个方法返回多个值的时候,需要借助于ref和out关键字
9.虚方法的一些知识:
重写虚方法必须具有相同的可访问性,且基类方法不能是Private
不能重写static方法或者非虚方法
方法,属性,事件和索引器都可以声明为virtual。