第三讲 现代面向对象的程序设计

面向对象的三个特征
封装,继承,多态


数据隐藏
封装性最有用的方式之一
实现方法——访问限制修饰符
public 无限制,允许任何人来访问
protected internal  = protected + internal
Internal 允许项目或程序内部的类来访问
protected 继承时子类可以对基类有完全访问权
private 只允许同一个类中的成员访问
属性和索引器也用来封装类的细节,并提供公用接口给该类的用户
C#默认为private

如何实现继承?
public class InsuranceAccount : Account
C# 中只支持单继承
防止继承
public sealed class XX

如何访问基类成员?
派生类可以调用基类的方法
通过使用base关键字
派生类在访问基类的时候有一定的限制,不能访问 private 的成员;

internal的基类成员只能被同一个程序集中的派生类访问

对象引用
基类可以引用派生类,但派生类不能引用基类。要引用怎么办,数据类型转换。
Account acc = new CheckAccount()
CheckAccount chk = acc; //Error
CheckAccount chk = (CheckAccount) acc;  //OK
如果acc不是CheckAccount的对象,那么运行时就将抛出System.InvalidCastException

多态性(1)
面向对象程序设计中的重要概念多态性。
在运行时,可以通过指向基类的引用,来调用实现派生类中的方法。
同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就

是多态性。
多态性通过派生类覆写基类中的虚函数方法来实现。

多态性(2)
编译时的多态性
编译时的多态性是通过重载来实现的。对于非虚的成员来说,系统在编译时,

根据传递的参数、返回的类型等信息决定实现何种操作。
运行时的多态性
运行时的多态性就是指直到系统运行时,才根据实际情况决定实现何种操作。
C#中,运行时的多态性通过覆写虚成员实现。

重载(Overload)
重载—类中定义的方法可能有不同的版本
public bool Withdraw(double amt, string name)
public double Withdraw(double amt) 
特点(两必须一可以)
方法名必须相同
参数列表必须不相同
返回值类型可以不相同

虚拟函数
声明虚方法
使用virtual关键字 public virtual bool Withdraw(…);
调用虚方法,运行时将确定调用对象是什么类的实例,并调用适当的覆写的方

法。
虚方法可以有实现体

覆写(Override)
子类中为满足自己的需要来重复定义某个方法的不同实现——覆写
通过使用关键字override来覆写
public override bool Withdraw(…)
只有虚方法和抽象方法才能被覆写
要求: (三相同)
相同的方法名称
相同的参数列表
相同的返回值类型

Override & Overload比较
Items    Override 覆写   Overload 重载
位置   存在于继承关系的类中   存在于同一类中
方法名     相同   相同
参数列表  相同   必须不同
返回值     相同   可以不相同

抽象方法
抽象方法是必须被派生类覆写的方法。
抽象方法是可以看成是没有实现体的虚方法
如果类中包含抽象方法,那么类就必须定义为抽象类,不论是否还包含其它一

般方法
publc abstract bool Withdraw(…);

何时使用继承?
代码重用,减少编写的代码量
设计重用
公用的字段和方法可以放到父类中,然后由其派生新的子类,子类有自己的字

段和方法。
经验而言——”is a”的关系:
如果A类是从B类中继承而来,即A是B的子类,那么我们可以说:“class A

is-a class B”

接口(1)
接口为类提供了蓝图
接口只提供定义
实现接口的数据类型必须提供接口成员的实现
接口本身可以从多个基接口派生

public interface IAccount
{
 void Method1();
 string Method2(int x,int y);
}

public class InsuranceAccount:IAccount
{
 void Method1(){......}
 string Method2(int x,int y){......}

}

posted @ 2009-02-26 16:31  teacherzj  阅读(175)  评论(0编辑  收藏  举报