`
leonardleonard
  • 浏览: 820742 次
社区版块
存档分类
最新评论

剖析C#的多态

阅读更多
一、什么是多态

面向对象程序设计中的另外一个重要概念是多态性。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。可以把一组对象放到一个数组中,然后调用它们的方法,在这种场合下,多态性作用就体现出来了,这些对象不必是相同类型的对象。当然,如果它们都继承自某个类,你可以把这些派生类,都放到一个数组中。如果这些对象都有同名方法,就可以调用每个对象的同名方法。

同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。多态性通过派生类重载基类中的虚函数型方法来实现。

在面向对象的系统中,多态性是一个非常重要的概念,它允许客户对一个对象进行操作,由对象来完成一系列的动作,具体实现哪个动作、如何实现由系统负责解释。

“多态性”一词最早用于生物学,指同一种族的生物体具有相同的特性。在C#中,多态性的定义是:同一操作作用于不同的类的实例,不同的类将进行不同的解释,最后产生不同的执行结果。C#支持两种类型的多态性:

● 编译时的多态性

编译时的多态性是通过重载来实现的。对于非虚的成员来说,系统在编译时,根据传递的参数、返回的类型等信息决定实现何种操作。

● 运行时的多态性

运行时的多态性就是指直到系统运行时,才根据实际情况决定实现何种操作。C#中,运行时的多态性通过虚成员实现。

编译时的多态性为我们提供了运行速度快的特点,而运行时的多态性则带来了高度灵活和抽象的特点。

二、实现多态

多态性是类为方法(这些方法以相同的名称调用)提供不同实现方式的能力。多态性允许对类的某个方法进行调用而无需考虑该方法所提供的特定实现。例如,可能有名为 Road 的类,它调用另一个类的 Drive 方法。这另一个类 Car 可能是 SportsCar 或 SmallCar,但二者都提供 Drive 方法。虽然 Drive 方法的实现因类的不同而异,但 Road 类仍可以调用它,并且它提供的结果可由 Road 类使用和解释。

可以用不同的方式实现组件中的多态性:

● 接口多态性。

● 继承多态性。

● 通过抽象类实现的多态性。

接口多态性

多个类可实现相同的“接口”,而单个类可以实现一个或多个接口。接口本质上是类需要如何响应的定义。接口描述类需要实现的方法、属性和事件,以及每个成员需要接收和返回的参数类型,但将这些成员的特定实现留给实现类去完成。

组件编程中的一项强大技术是能够在一个对象上实现多个接口。每个接口由一小部分紧密联系的方法、属性和事件组成。通过实现接口,组件可以为要求该接口的任何其他组件提供功能,而无需考虑其中所包含的特定功能。这使后续组件的版本得以包含不同的功能而不会干扰核心功能。其他开发人员最常使用的组件功能自然是组件类本身的成员。然而,包含大量成员的组件使用起来可能比较困难。可以考虑将组件的某些功能分解出来,作为私下实现的单独接口。

根据接口来定义功能的另一个好处是,可以通过定义和实现附加接口增量地将功能添加到组件中。优点包括:

1.简化了设计过程,因为组件开始时可以很小,具有最小功能;之后,组件继续提供最小功能,同时不断插入其他的功能,并通过实际使用那些功能来确定合适的功能。

2.简化了兼容性的维护,因为组件的新版本可以在添加新接口的同时继续提供现有接口。客户端应用程序的后续版本可以利用这些接口的优点。

通过继承实现的多态性

多个类可以从单个基类“继承”。通过继承,类在基类所在的同一实现中接收基类的所有方法、属性和事件。这样,便可根据需要来实现附加成员,而且可以重写基成员以提供不同的实现。请注意,继承类也可以实现接口,这两种技术不是互斥的。

C# 通过继承提供多态性。对于小规模开发任务而言,这是一个功能强大的机制,但对于大规模系统,通常证明会存在问题。过分强调继承驱动的多态性一般会导致资源大规模地从编码转移到设计,这对于缩短总的开发时间没有任何帮助。

何时使用继承驱动的多态性呢?使用继承首先是为了向现有基类添加功能。若从经过完全调试的基类框架开始,则程序员的工作效率将大大提高,方法可以增量地添加到基类而不中断版本。当应用程序设计包含多个相关类,而对于某些通用函数,这些相关类必须共享同样的实现时,您也可能希望使用继承。重叠功能可以在基类中实现,应用程序中使用的类可以从该基类中派生。抽象类合并继承和实现的功能,这在需要二者之一的元素时可能很有用。

通过抽象类实现的多态性

抽象类同时提供继承和接口的元素。抽象类本身不能实例化,它必须被继承。该类的部分或全部成员可能未实现,该实现由继承类提供。已实现的成员仍可被重写,并且继承类仍可以实现附加接口或其他功能。

抽象类提供继承和接口实现的功能。抽象类不能示例化,必须在继承类中实现。它可以包含已实现的方法和属性,但也可以包含未实现的过程,这些未实现过程必须在继承类中实现。这使您得以在类的某些方法中提供不变级功能,同时为其他过程保持灵活性选项打开。抽象类的另一个好处是:当要求组件的新版本时,可根据需要将附加方法添加到基类,但接口必须保持不变。

何时使用抽象类呢?当需要一组相关组件来包含一组具有相同功能的方法,但同时要求在其他方法实现中具有灵活性时,可以使用抽象类。当预料可能出现版本问题时,抽象类也具有价值,因为基类比较灵活并易于被修改。 


 
分享到:
评论

相关推荐

    c#多态 完全 通 源码

    在这个"完全通源码"的压缩包中,我们可以期待看到关于C#多态的实例和源代码,帮助我们深入理解和运用这个概念。 1. **多态的定义**:多态意味着“多种形态”。在C#中,多态主要体现在方法的重载(Overloading)和...

    深入剖析C#的多态××××××

    深入剖析C#的多态性,我们首先要理解多态性的本质。多态性是面向对象编程的核心特性之一,它允许程序处理多种不同类型的对象,但使用相同的接口或方法调用。这种特性使得代码更加灵活,提高了代码的复用性和可扩展性...

    C#多态实现计算器有BUG,求解决!

    在你提到的问题中,“C#多态实现计算器有BUG,求解决!”很可能是指在设计和实现一个基于多态的计算器类层次结构时遇到了问题。下面,我们将深入探讨多态性在C#中的应用以及可能引发的常见问题,并给出相应的解决...

    C#中多态现象和多态的实现方法

    本文实例讲述了C#中多态现象和多态的实现方法。分享给大家供大家参考。具体分析如下: 面向对象的特征封装、继承和多态。Polymorphism(多态性)来源于希腊单词,指“多种形态”。多态性的一个重要特征是方法的调用...

    简单的画图板源码 C#

    这是一个基于C#编程语言开发的简单画图板项目,旨在帮助初学者理解多态性这一核心面向对象编程概念。...通过分析和修改这个项目,开发者可以进一步学习图形用户界面(GUI)开发、事件驱动编程以及图形绘制技术。

    c#类与对象的继承与多态——图形间的继承关系

    通过分析这些代码,开发者可以更直观地理解C#中的继承和多态是如何工作的,并学习如何将这些概念应用到实际项目中。 总结来说,本主题涉及了C#中的面向对象编程,主要集中在继承和多态这两个关键特性。通过Shape...

    C#语言继承多态

    #### 四、案例分析:继承与多态在C#中的实践 以实验内容为例,首先定义了基类`Person`,其中包含了基本的属性和方法。然后,创建了多个派生类,如`male`、`female`、`boy`和`girl`,这些派生类继承自`Person`,并且...

    2、C#学生基本信息录入程序

    在本项目中,我们关注的是一个使用C#编程语言编写的“学生基本信息录入程序”。C#(读作"C sharp")是一种由微软公司...通过分析和理解这样的程序,开发者可以提升自己在数据处理、用户交互和文件操作等方面的能力。

    C#中多态、重载、重写区别分析

    在C#编程语言中,多态(Polymorphism)、重载(Overloading)和重写(Overriding)是面向对象编程的三个核心概念,它们分别提供了不同的功能和灵活性。下面我们将详细探讨这三个概念以及它们之间的区别。 首先,...

    C#中CLR虚方法的多态调用

    通过深入剖析C#中的虚方法及其在CLR中的实现细节,我们了解到多态调用的本质在于运行时确定方法的真正实现。通过使用MethodTable和虚方法表(VTable),CLR能够在运行时动态决定调用哪个方法版本,从而支持C#语言的...

    C#OOP内部测试机试题

    ### C# OOP 内部测试机试题解析 #### 题目一:读书日记系统 **背景**:为了帮助教师更好地跟踪学生的...这些试题不仅考察了C#的基础语法,还涉及到了面向对象编程的核心概念和技术,如多态、继承、泛型、XML解析等。

    原来多态还可以这样

    在Java和C#等语言中,接口也是实现多态的重要手段,类可以实现多个接口,从而具备多种行为,这也是多态的一种表现。 博主可能在文章中探讨了以下内容: 1. 多态在设计模式中的应用:例如工厂模式、策略模式、装饰...

    C#对象编程之继承多态

    对象编程语言最容易搞混这些概念:重载、多态、虚方法、抽象方法。还有这些关键字abstract/virtual/base/overrid/new应该在什么时候用。 本文档用最精简的文字描述了这些概念的区别,并有源码示例。刚看可能觉得写的...

    C#软件项目开发全程剖析.rar

    《C#软件项目开发全程剖析》是一本针对C#编程语言和软件开发流程深度解析的教程,由清华大学出版社出版。本书旨在帮助读者从基础到高级,全面掌握C#语言在实际项目开发中的应用技巧和实践经验。 C#是微软公司推出的...

    通过实例来剖析C#继承机制

    下面我们将通过一个实例深入剖析C#中的继承机制。 首先,让我们理解一下什么是继承。在C#中,我们可以使用`:`符号定义一个类作为另一个类的子类。例如: ```csharp public class ParentClass { public int ...

    C#数据结构和算法分析

    ### C#数据结构和算法分析知识点详解 #### 一、数据结构教材的选择与编写背景 在探讨具体的C#数据结构和算法之前,我们先来了解一下本书的编写背景和选择C#作为教学语言的原因。 - **编写背景**:本书的编写是在...

    完全剖析 C#(2001)

    《完全剖析 C#》是2001年出版的一本深度解析C#编程语言的专业书籍,对于想要深入了解C#的开发者来说,具有很高的参考价值。这本书可能是C#初版发布时的重要参考资料,对于理解早期版本的C#特性和规范极具帮助。 C#...

    C#多态性的介绍

    #### 四、应用案例分析 考虑以下代码片段,演示了多态性的使用: ```csharp class Program { static void Main(string[] args) { B b = new B(); A a = b; // 多态赋值 b.F(); b.G(); a.F(); // 调用的是B类...

Global site tag (gtag.js) - Google Analytics