C# 多态性的深入理解

MSDN 上面的定义:通过继承,一个类可以有多种类型:可以用作它自己的类型,任何基类型,或者在实现接口时用作任何接口的类型。
从两个方面来说明多态
1.在运行时,方法参数和集合或者是数组等位置,派生类的对象都可以作为基类的对象处理,发生此情况时,该对象的声明类型不再与运行时类型相同。
2.基类定义实现虚方法,派生类重写这些方法,在运行时,CLR会查找运行时类型,并且调用派生类重写的方法.


代码如下:

class Shape
    {
        public virtual void Draw()
        {
            Console.WriteLine("Draw a shape");
        }
    }
    class Circle : Shape
    {
        public override void Draw()
        {
            Console.WriteLine("Draw a circle");
        }
    }
    class Rectangle : Shape
    {
        public override void Draw()
        {
            Console.WriteLine("Draw a Rectangle");
        }
    }
    class Triangle : Shape
    {
        public override void Draw()
        {
            Console.WriteLine("Draw a Triangle");
        }
    }
    class Programm
    {
        static void Main()
        {
            //此次就说明了,派生类对象可以作为基类对象进行处理
            Shape[] shapes =
            {
             new Circle(),
             new Rectangle(),
             new Triangle()
            };

foreach (Shape s in shapes)
            {
                //调用Draw()方法的时候,调用了派生重写的方法,而不是基类
                s.Draw();
            }
        }
    }

(0)

相关推荐

  • C#实现的简单链表类实例

    本文实例讲述了C#实现的简单链表类.分享给大家供大家参考.具体如下: 一.关于C#链表 C#链表可用类LinkedList来存放.本文中的类MyLinkedList只是实现了该类的最基本的功能.C#中没有指针,但因为C#中类在赋值时传递的是地址,因此仍然可以利用这点制作一个链表. 二.结点类Node和链表类MyLinkedList代码 /// <summary> /// 链表结点 /// </summary> class Node { //结点数据,前后结点 public obje

  • C#类的多态性详解

    第一种:编译时的多态性,直接这样说不知道说啥?程序执行过程主要分为三步:编译,链接,运行.在编译时体现的多态性是通过方法的重载来实现的.方法的重载我们听过,就是一个类对象调用若干同名,但参数类型.个数不同.类对象是根据参数类型,个数来决定调用哪个同名方法,实现何种操作.C#语言的方法重载与C++.java基本是一样的,但是C#还包含C++的运算符重载,java里面没有这个概念. 第二种:运行时的多态性,是在系统运行时,调用一个名字相同,参数类型也相同以及个数也完全一样的方法,但会完成不同的操作.

  • C#通过Semaphore类控制线程队列的方法

    本文实例讲述了C#通过Semaphore类控制线程队列的方法.分享给大家供大家参考.具体实现方法如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Diagnostics; using System.Threading; using System.ComponentModel; using System.Col

  • C#实现的XML操作类实例

    本文实例讲述了C#实现的XML操作类.分享给大家供大家参考.具体如下: 这里讲述了C#写的一个XML操作类,包括读取/插入/修改/删除. using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.W

  • C#实现将类的内容写成JSON格式字符串的方法

    本文实例讲述了C#实现将类的内容写成JSON格式字符串的方法.分享给大家供大家参考.具体如下: 本例中建立了Person类,赋值后将类中内容写入到字符串中 运行本代码需要添加引用动态库Newtonsoft.Json 程序代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; //需要引用 Newtonsoft.Js

  • C++动态分配和撤销内存以及结构体类型作为函数参数

    C++动态分配内存(new)和撤销内存(delete) 在软件开发过程中,常常需要动态地分配和撤销内存空间,例如对动态链表中结点的插入与删除.在C语言中是利用库函数malloc和free来分配和撤销内存空间的.C++提供了较简便而功能较强的运算符new和delete来取代malloc和free函数. 注意: new和delete是运算符,不是函数,因此执行效率高. 虽然为了与C语言兼容,C++仍保留malloc和free函数,但建议用户不用malloc和free函数,而用new和delete运算

  • C#验证码识别类完整实例

    本文实例讲述了C#验证码识别类.分享给大家供大家参考.具体实现方法如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Drawing; using System.Drawing.Imaging; using System.Runtime.InteropServices; namespace 验证码处理 { class VerifyCode {

  • C#实现实体类与字符串互相转换的方法

    本文实例讲述了C#实现实体类与字符串互相转换的方法.分享给大家供大家参考.具体实现方法如下: using System; using System.Collections.Generic; using System.Text; namespace PackDLL.Data.ConvertData { /// <summary> /// 实体类.字符串互相转换 /// </summary> public class PackReflectionEntity<T> { //

  • C#操作ftp类完整实例

    本文实例讲述了C#操作ftp类.分享给大家供大家参考.具体如下: using System; using System.Collections.Generic; using System.Text; using System.IO; using System.Net; using System.Globalization; namespace FtpTest1 { public class FtpWeb { string ftpServerIP; string ftpRemotePath; st

  • 详解Oracle数据库各类控制语句的使用

    Oracle数据库各类控制语句的使用是本文我们主要要介绍的内容,包括一些逻辑控制语句.Case when的使用.While的使用以及For的使用等等,接下来我们就开始一一介绍这部分内容,希望能够对您有所帮助. Oracle 中逻辑控制语句  If elsif else end if set serverout on; declare per_dep_count number; begin select count(*) into per_dep_count from emp; if per_de

  • C#编程自学之数据类型和变量一

    一.数据类型与变量的介绍 在程序运行的过程中计算机需要记录大量的状态 数据(这里我们统称数据).那这些数据都存放在哪呢?程序在运行过程中的数据一般都存放在内存.那么他们在内存中如何存放的一种描述就是数据类型.变量则就是数据类型的实体.那么我们来看一个例子: 假如现在需要设计一个程序计算整数 10 与 20 的和, 请看如下代码: using System; namespace MyProgram { class Program { static void Main(string[] args)

  • C#编程自学之类和对象

    在之前的文章中介绍了C#是一种完全面向对象的语言,既然是完全面向对象的语言就应该用面向对象的模式去学习C#,不了解面向对象?不必担心.这篇文章将介绍学习C#基础部分所要用到的面向对象的知识,后面文章我们将系统的介绍C#面向对象编程.接下来就开始我们C#旅程的起点! 一.类与对象 1 什么是类? 在我们现实世界中,我们经常会把具有一系列相同行为和属性的事物归类,例如:人类,人类就是我们所说的类.         例如 所有的人都有五官,内脏等等(除其他特殊原因),这些组成部分我们称之为人类的属性.

  • C#编程自学之数据类型和变量二

    我们继续自学C#编程教程,在上一课中介绍了C#的基本数据类型以及变量,今天这一节课我们来介绍值类型与引用类型! 一.什么是值类型与引用类型? C#与大多数面向对象语言数据类型一样,分为值类型与引用类型两种?如何区分这两种类型?如图: 根据类型结构图我们得出: 1.值类型包括 内置数据类型如(int double float) 用户自定义值类型(struct 结构体) 枚举(emun) 2.引用类型包括 接口类型 类类型等等. 知道了那些类型属于值类型与那些类型属于引用类型之后,我们来分析一下值类

随机推荐