24. C# -- 多态性

1、什么是多态
   面向对象程序设计中的另外一个重要概念是多态性。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。可以把一组对象放到一个数组中,然后调用它们的方法,在这种场合下,多态性作用就体现出来了,这些对象不必是相同类型的对象。当然,如果它们都继承自某个类,你可以把这些派生类,都放到一个数组中。如果这些对象都有同名方法,就可以调用每个对象的同名方法。
同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。多态性通过派生类重载基类中的虚函数型方法来实现。在面向对象的系统中,多态性是一个非常重要的概念,它允许客户对一个对象进行操作,由对象来完成一系列的动作,具体实现哪个动作、如何实现由系统负责解释。

2、实现多态
   多态性是类为方法(这些方法以相同的名称调用)提供不同实现方式的能力。多态性允许对类的某个方法进行调用而无需考虑该方法所提供的特定实现。
   可以用不同的方式实现组件中的多态性:
   ● 接口多态性。
   ● 继承多态性。
   ● 通过抽象类实现的多态性。
   
示例:实现多态性的程序

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
    public class DrawingBase
{
        public virtual void Draw()
{
            Console.WriteLine("I‘m just a generic drawing object.");
}
}
    public class Line : DrawingBase
{
        public override void Draw()
{
            Console.WriteLine("I‘m a Line.");
}
}
 
    public class Circle : DrawingBase
{
        public override void Draw()
{
            Console.WriteLine("I‘m a Circle.");
}
}
    public class Square : DrawingBase
{
        public override void Draw()
{
            Console.WriteLine("I‘m a Square.");
}
}
    public class DrawDemo
{
        public static int Main(string[] args)
{
            DrawingBase[] dObj = new DrawingBase[4];
            dObj[0] = new Line();
            dObj[1] = new Circle();
            dObj[2] = new Square();
            dObj[3] = new DrawingBase();
            foreach (DrawingBase drawObj in dObj)
drawObj.Draw();
            Console.ReadLine();
            return 0;
}
}
}

输出结果是:

I‘m a Line.

I‘m a Circle.

I‘m a Square.

I‘m just a generic drawing object.

程序说明:上面程序演示了多态性的实现。在DrawDemo类中的Main( )方法中,创建了一个数组,数组元素是DrawingBase类的对象。该数组名为dObj,是由四个DrawingBase类型的对象组成。接下来,初始化dObj数组,由于Line,Circle和Square类都是DrawingBase类的派生类,所以这些类可以作为dObj数组元素的类型。如果C#没有这种功能,你得为每个类创建一个数组。继承的性质可以让派生对象当作基类成员一样用,这样就节省了编程工作量。一旦数组初始化之后,接着是执行foreach循环,寻找数组中的每个元素。在每次循环中,dObj 数组的每个元素(对象)调用其Draw()方法。多态性体现在:在运行时,各自调用每个对象的Draw()方法。尽管dObj数组中的引用对象类型是DrawingBase,这并不影响派生类重载DrawingBase类的虚方法Draw()。在dObj 数组中,通过指向DrawingBase基类的指针来调用派生类中的重载的Draw( )方法。

参考:

http://blog.csdn.net/hliq5399/article/details/6305335

时间: 2024-09-29 08:43:04

24. C# -- 多态性的相关文章

Java_Notes01

[1]数据类型划分:   a.基本数据类型:boolean,tyte,char,short,int,long,float,double   b.引用数据类型:它以一种特殊的方式指向变量的实体(类似于指针)这类变量在声明时不会分配内存,必须另外进行开辟内存空间的操作.---类,接口,数组   c.当声明一个数组时,编译器仅会在栈内存分配一块空间给它,用来保存指向数组实体的地址的名称---数组变量所保存的并非是数组的实体,而是数组堆内存的参考地址     声明之后,接着要做的就是做堆内存分配的操作.

C++之多态性与虚函数

面向对象程序设计中的多态性是指向不同的对象发送同一个消息,不同对象对应同一消息产生不同行为.在程序中消息就是调用函数,不同的行为就是指不同的实现方法,即执行不同的函数体.也可以这样说就是实现了“一个接口,多种方法”. 从实现的角度来讲,多态可以分为两类:编译时的多态性和运行时的多态性.前者是通过静态联编来实现的,比如C++中通过函数的重载和运算符的重载.后者则是通过动态联编来实现的,在C++中运行时的多态性主要是通过虚函数来实现的,也正是今天我们要讲的主要内容. 1.不过在说虚函数之前,我想先介

C++基础(早年笔记)—多态性(一)

多态性(一) 多态性就是不同对象收到相同消息时,产生不同的动作.用一个名字定义不同的函数,这些函数执行不同但又类似的操作,即用同样的接口访问功能不同的函数,实现“一个接口,多种方法”. C++支持的多态性分为编译时多态性和运行时多态性.其中编译时多态性主要通过函数重载和操作符重载来实现,而运行时多态通过继承和虚函数来实现. 2.1虚函数 2.1.1引入派生类后的对象指针 使用: 1 #include<iostream> 2 using namespace std; 3 4 class my_b

C++中多态性学习(上)

多态性学习(上) 什么是多态? 多态是指同样的消息被不同类型的对象接收时导致不同的行为.所谓消息是指对类的成员函数的调用,不同的行为是指不同的实现,也就是调用了不同的函数.虽然这看上去好像很高级的样子,事实上我们普通的程序设计中经常用到多态的思想.最简单的例子就是运算符,使用同样的加号“+”,就可以实现整型数之间.浮点数之间.双精度浮点数之间的加法,以及这几种数据类型混合的加法运算.同样的消息--加法,被不同类型的对象—不同数据类型的变量接收后,采用不同的方法进行相加运算.这些就是多态现象. 多

JAVA学习--接口使用方法2(接口间的多态性)

1 //接口与具体的实现类之间也存在多态性 2 public class TestInterface { 3 4 public static void main(String[] args) { 5 Duck d = new Duck(); 6 TestInterface.test1(d); 7 TestInterface.test2(d); 8 TestInterface.test3(d); 9 } 10 11 public static void test1(Runner r){//Runn

JAVA学习--面向对象的特征三:多态性

* 面向对象的特征三:多态性  * 1.多态性指的是什么?多态性,可以理解为一个事物的多种表型形态.  *   1)方法的重载与重写  2)子类对象的多态性  *  * 2.子类对象的多态性使用的前提:①要有类的继承②要有子类对父类方法的重写  *  * 3.程序运行分为编译状态和运行状态.  *   对于多态性来说,编译时,"看左边",将此引用变量理解为父类的类型  *   运行时,"看右边",关注于真正对象的实体:子类的对象.那么执行的方法就是子类重写的.  *

C++多态性的一个典型例子(转)

本文摘录自C++多态性的一个典型例子. 例题:先建立一个Point(点)类,包含数据成员x,y(坐标点).以它为基类,派生出一个Circle(圆)类,增加数据成员r(半径),再以Circle类为直接基类,派生出一个Cylinder(圆柱体)类,再增加数据成员h(高).要求编写程序,重载运算符“<<”和“>>”,使之能用于输出以上类对象. 这个例题难度不大,但程序很长.对于一个比较大的程序,应当分成若干步骤进行.先声明基类,再声明派生类,逐级进行,分步调试. 1. 声明基类Point

将子类对象引用赋值给超类对象 JAVA 编译时多态性

将子类对象引用赋值给超类对象 JAVA 编译时多态性(转) (2012-05-10 11:24:05) 转载▼ 标签: 杂谈 分类: 也无晴_soft 1.通过将子类对象引用赋值给超类对象引用变量来实现动态方法调用. DerivedC c2=new DerivedC(); BaseClass a1= c2; //BaseClass 基类,DerivedC是继承自BaseClass的子类 a1.play(); //play()在BaseClass,DerivedC中均有定义,即子类覆写了该方法 分

[转]C++之多态性与虚函数

面向对象程序设计中的多态性是指向不同的对象发送同一个消息,不同对象对应同一消息产生不同行为.在程序中消息就是调用函数,不同的行为就是指不同的实现方法,即执行不同的函数体.也可以这样说就是实现了“一个接口,多种方法”. 从实现的角度来讲,多态可以分为两类:编译时的多态性和运行时的多态性.前者是通过静态联编来实现的,比如C++中通过函数的重载和运算符的重载.后者则是通过动态联编来实现的,在C++中运行时的多态性主要是通过虚函数来实现的,也正是今天我们要讲的主要内容. 1.不过在说虚函数之前,我想先介