您的位置:首页 > 编程语言 > C#

C#入门分享(六)——封装、继承与多态

2015-04-27 12:14 176 查看
C#是纯面向对象的编程语言,运用面向对象的思想对于编写一个大型工程就显得非常重要。和其他的面向对象语言一样,C#也主要是通过封装(encapsulating)、继承(inheritance)和多态(polymorphism)来实现。

(一)封装

客户希望在不使用方法的情况下访问对象的状态,但是类的设计者却想将类的状态隐藏在类成员中而让客户只能通过方法间接访问对象的状态。属性满足了这两个目的: 通过属性(properties)来封装数据,为客户提供简单的“类似成员变量”的接口;同时为设计者提供了“使用方法来实现”的OO设计所必须的数据隐藏性。

通过上一篇博客所讲的get与set控制器我们可以定义一些存储属性的私有成员,例如:



可以在get和set前加一些修饰符,如:protected,internal,private,但使用修饰符时,必须get和set访问方法都存在,且只能修饰其中之一。并且修饰符的访问级别要低于属性或索引器的访问级别。internal关键字是类型和类型成员的访问修饰符。只有在同一个程序集的文件中,内部类型或者是成员才可以访问。

有时需要使用静态构造方法初始化,但又不希望数值被改变的时候使用关键字readonly。



(二)继承

在面向对象的编程中,有两种截然不同的继承类型:实现继承和接口继承。

实现继承:表示一个类型派生于一个基类型,它拥有该基类型的所有成员字段和函数。在实现继承,派生类型采用基类型的每个函数的实现代码,除非在派生类型的定义中指 定重写某个函数的实现代码。在需要给现有的类型添加功能,或许多相关的类型共享一组重要的公共功能时,这种类型的继承非常有用。

接口继承:表示一个类型只继承了函数的签名,没有继承任何实现代码 。在需要指定该类型具有某些可用的特性时,最好使用这种类型的继承。

一些语言(如C++)支持所谓的 “多重继承”,即 一个类派生自多个类。C#不支持多重实现继承。而C#又允许类型派生自多个接口:多重接口继承。这说明,C#可以派生自另一个类和任意多个接口。更准确地说,因为 System.Object是一个公共的基类,所以每个C#类(除了Object类之外)都有一个基类,还可以有任意多个基接口。

实现继承:

如果要声明派生自另一个类的一个类,就可以使用下面的语法(基类放冒号后面):



这个语法非常类似于C++ 和 Java 中的语法,但是,C++程序员习惯于使用公共和私有继承的概念,要注意不支持私有继承,因此在基类名上没有public 或 private限定符。支持私有继承只会大大增加语言的复杂性。

如果类(或结构)也派生自接口,则用逗号分隔列表中的基类和接口:



把一个基类函数声明为virtual,就可以在任何派生类中重写该函数:



抽象类和抽象函数:

C#允许把类和函数声明为abstract。抽象类不能实例化,而抽象函数不能直接实现,必须在非抽象的派生类中重写。显然,抽象函数本身也是虚拟的(尽管也不需要提供 virtual关键字,实际上,如果提供了该关键字,就会产生一个语法。如果类包含抽象函数,则该类也是抽象的,也必须声名为抽象的:



(三)多态

继承有两各方面的作用最为强大,一方面可以让代码有很强的重用性,另一方面就是多态。

多态就是:允许将子类类型的指针赋值给父类类型的指针。也就是同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。

理解多态之前首先要对面向对象的里氏替换原则和开放封闭原则有所了解。

里氏替换原则(Liskov Substitution Principle):

派生类(子类)对象能够替换其基类(超类)对象被使用。通俗一点的理解就是“子类是父类”,当需要一个父类类型的对象的时候可以给一个子类类型的对象;当 需要一个子类类型对象的时候给一个父类类型对象是不可以的!

开放封闭原则(Open Closed Principle):

封装变化、降低耦合,软件实体应该是可扩展,而不可修改的。也就是说,对扩展是开放的,而对修改是封闭的。因此,开放封闭原则主要体现在两个方面:对扩 展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。对修改封闭,意味着类一旦设计完成,就可以独立完成其工作,而不要对类进 行任何修改。

我们先来看下怎样用虚方法实现多态:

创建基类Bird如下,添加一个虚方法Eat():



创建子类Magpie如下,继承父类Bird,重写父类Bird中的虚方法Eat():



创建一个子类Eagle如下,继承父类Bird,重写父类Bird中的虚方法Eat():



到此,一个基类,两个个子类已经创建完毕,接下来我们在主函数中来看下多态是怎样体现的:



这样就会显示各类相应的内容了。

除了通过虚方法实现多态,还有另外两种方法,即利用抽象或者接口来实现多态,在这里就先不介绍了,大家可以查阅相关资料学习这两种实现多态的方法。

关于C#面向对象编程我们就先介绍到这,下一篇博客为大家介绍C#的字符串与正则表达式。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: