封装性,继承性,多态性。
封装性
封装:将类的内部结构隐藏起来。
实现方法之一:访问修饰符
public, 无限制,公有的
protected internal,
internal, 允许项目或内部的类来访问
protected , 子类可以完全访问基类。
private 只允许同一类中成员访问。(默认的访问修饰符)
继承性
子类可以有能力直接从基类中获得其所有代码和数据,而且还可以定义自身的成员。
Public class lnsuranceAccount : Account 左边是子类,右边是基类
C#中只支持单继承
防止继承:public sealed class XX
派生类可以调用基类的方法
通过使用base关键字
派生类在访问基类的时候有一定的限制,不能访问private中的成员;internal的基类成员只能被同一类中的派生类访问。
Public class Account { Public double balane ; Public bool Withdraw(double amt) { Balance -= amt; Return true; } } Public class CheckAccount : Account { Public bool Withdraw(double amt) { If(amt <= base.balance) Return base.Withdraw(amt) Else Return false; } } //CheckAccount是子类,Account是基类。
对象引用:
checkAccount ca = new CheckAccount();
Account acc = new CheckAccount(); 基类的对象指针可以实现子类的实例化
//子类中肯定包含基类成员,而基类成员不一定包含有子类中的成员。
Solution :数据类型转换
Account acc = new CheckAccount()
CheckAccount chk = acc // Error
CheckAccount chk = (CheckAccount)acc //OK
如果acc不是CheckAccount的对象,那么运行时就会抛出System.InvalidCastException
何时使用继承
1, 代码重用,减少编写的代码量
2, 设计重用:公用的字段和方法可以放到父类中,然后由其派生新的子类,子类有自己的字段和方法。
3, 经验而言------“is a”的关系:
如果A类是从B类中继承而来,即A是B的子类,那么我们可以说class A is a Class B
多态性
在运行时,可以通过指向基类的引用,来调用实现派生类中的方法。
//在运行时,可以通过指向基类的引用,来调用实现派生类中的方法。
//当然,如果它们都继承自某个类,你可以把这些派生类,都放到一个数组中。
//如果这些对象都有同名方法,就可以调用每个对象的同名方法。
同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。
//在面向对象的系统中,多态性是一个非常重要的概念,它允许客户对一个对象进行操作
//,由对象来完成一系列的动作,具体实现哪个动作、如何实现由系统负责解释。
多态性通过派生类覆写基类中的虚函数型方法来实现。
编译时的多态性
编译时的多态性是通过重载来实现的。
对于非虚的成员来说,系统在编译时,根据传递的参数、返回的类型等信息决定实现何种操作。
运行时的多态性
运行时的多态性就是指直到系统运行时,才根据实际情况决定实现何种操作。
C#中,运行时的多态性通过覆写虚成员实现。
编译时的多态性为我们提供了运行速度快的特点,而运行时的多态性则带来了高度灵活和抽象的特点。
重载(overload):类中定义的方法可能有不同的版本
public bool Withdraw(double amt,string name)
public double Withdraw(double amt)
特点:方法名必须相同,参数列表必须不相同,返回值类型可以不相同
虚拟函数:使用virtual关键字 public virtual bool withdrow(…)
调用虚方法,运行时将确定调用对象是什么类的实例,并调用适当的覆写的方法
虚方法可以有实现体
覆写(override):子类中为满足自己的需要来重复定义某个方法的不同实现
通过使用关键字override来覆写
Public override bool Withdraw(…)
只有虚方法和抽象方法才能被覆写
要求:相同的方法名称,相同的参数列表,相同的返回值类型。
抽象方法:生必须被派类覆写的方法,可以看成是没有实现体的虚方法。
如果类中包含抽象方法,那么类就必须定义为抽象类,不论是否还包含其他一般方法
Public abstract bool Withdraw(…)
接口:为类提供了蓝图,只提供定义,实现接口的数据类型必须提供接口成员的实现,接口本身可以从多个基接口派生。
使用interface关键字
Public interface IAccount { Void Method1(); String Method2(int x, int y) }
Public class InsuranceAccount: IAccount { Void Method1() { …. } String Method2(int x, int y ) { … } }
总结:
1.访问限制
2.继承和接口是互补的
Ø“is-a”—— inherits
Ø“acts-like”—— implements
Ø设计中经常是两者都使用的
3.覆写和重载
ØOverride & Overload 的区别
4.虚方法和抽象方法区别
其他参考资源
1.Webcast:
§http://www.microsoft.com/china/msdn/events/webcasts/shared/Webcast/MSDNWebCast.aspx
2.Resources:
§MSDN Library http://www.microsoft.com/china/MSDN/library/default.mspx
§GotDotNet
MSDN flash:
§http://www.microsoft.com/china/newsletter/case/MSDN.asp