基础概念
[**1.1
封装]()
封装 被定义为”把一个或多个项目封闭在一个物理的或者逻辑的包中”。在面向对象程序设计方法论中,封装是为了防止对实现细节的访问。
抽象和封装是面向对象程序设计的相关特性。抽象允许相关信息可视化,封装则使开发者实现所需级别的抽象。
C# 封装根据具体的需要,设置使用者的访问权限,并通过 访问修饰符 来实现。
一个 访问修饰符** 定义了一个类成员的范围和可见性。C# 支持的访问修饰符如下所示:
·
public:所有对象都可以访问;
·
private:对象本身在对象内部可以访问;
·
protected:只有该类对象及其子类对象可以访问
·
internal:同一个程序集的对象可以访问;
·
protected internal:访问限于当前程序集或派生自包含类的类型。
比如说:一个人A为父类,他的儿子B,妻子C,私生子D(注:D不在他家里)
如果我们给A的事情增加修饰符:
·
public事件,地球人都知道,全公开
·
protected事件,A,B,D知道(A和他的所有儿子知道,妻子C不知道)
·
private事件,只有A知道(隐私?心事?)
·
internal事件,A,B,C知道(A家里人都知道,私生子D不知道)
·
protected internal事件,A,B,C,D都知道,其它人不知道
[**1.2
多态]()
同一个行为具有多个不同表现形式或形态的能力。(一个接口多个功能)
1.
静态多态-编译时发生函数响应(调用)
a.
函数重载
同一个函数可以有多种功能。
b.
运算符重载
operator 关键字用于在类或结构声明中声明运算符。运算符声明可以采用下列四种形式之一:
public static result-type operator unary-operator ( op-type operand )
public static result-type operator binary-operator ( op-type operand, op-type2 operand2 )
public static implicit operator conv-type-out ( conv-type-in operand )
public static explicit operator conv-type-out ( conv-type-in operand )
参数:
·
result-type 运算符的结果类型。
·
unary-operator 下列运算符之一:+ - ! ~ ++ — true false
·
op-type 第一个(或唯一一个)参数的类型。
·
operand 第一个(或唯一一个)参数的名称。
·
binary-operator 其中一个:+ - * / % & | ^ << >> == != > < >= <=
·
op-type2 第二个参数的类型。
·
operand2 第二个参数的名称。
·
conv-type-out 类型转换运算符的目标类型。
·
conv-type-in 类型转换运算符的输入类型。
注意:**
前两种形式声明了用户定义的重载内置运算符的运算符。并非所有内置运算符都可以被重载(请参见可重载的运算符)。op-type 和 op-type2 中至少有一个必须是封闭类型(即运算符所属的类型,或理解为自定义的类型)。例如,这将防止重定义整数加法运算符。
后两种形式声明了转换运算符。conv-type-in 和
conv-type-out 中正好有一个必须是封闭类型(即,转换运算符只能从它的封闭类型转换为其他某个类型,或从其他某个类型转换为它的封闭类型)。
运算符只能采用值参数,不能采用 ref 或 out 参数。
C# 要求成对重载比较运算符。如果重载了==,则也必须重载!=,否则产生编译错误。同时,比较运算符必须返回bool类型的值,这是与其他算术运算符的根本区别。
C# 不允许重载=运算符,但如果重载例如+运算符,编译器会自动使用+运算符的重载来执行+=运算符的操作。
运算符重载的其实就是函数重载。首先通过指定的运算表达式调用对应的运算符函数,然后再将运算对象转化为运算符函数的实参,接着根据实参的类型来确定需要调用的函数的重载,这个过程是由编译器完成。
任何运算符声明的前面都可以有一个可选的属性(C# 编程指南)列表。
2.
动态多态 -运行时发生函数响应。
a.
抽象类
Abstract
作用à
用于接口部分类的实现(派生类继承抽象类时,实现完成)。抽象类包含抽象方法,抽象方法可被派生类实现。
规则à
·
不能创建抽象类的实例
·
不能在抽象类外定义抽象方法
·
不能把抽象类声明为sealed(类前带关键字sealed代表该类是密封类,不能被继承)
b.
虚方法
Virtual
作用à用于方法在继承类中的实现(在不同的继承类中有不同的实现)。
规则à
·
virtual修饰的方法必须有实现(哪怕是仅仅添加一对大括号),而abstract修饰的方法一定不能实现。
·
virtual可以被子类重写,而abstract必须被子类重写。
注:
重载和重写
重载(overload)是提供了一种机制, 相同函数名通过不同的返回值类型以及参数来表来区分的机制。
重写(override)是用于重写基类的虚方法,这样在派生类中提供一个新的方法。
[**1.3
继承]() 继承的思想实现了 属于(IS-A) 关系。例如,哺乳动物 属于(IS-A) 动物,狗 属于(IS-A) 哺乳动物,因此狗 属于(IS-A)** 动物。