参考网址:http://www.cnblogs.com/zhangkai2237/archive/2012/12/20/2826734.html

多态的定义:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。

在理解多态之前了解几个概念:重载,重写,虚方法,抽象方法以及隐藏方法。

1、重载:在同一个作用域(一般指一个类)两个或多个方法函数名相同,参数列表不同的方法叫做重载,他们有三个特点

(1)方法名必须相同

(2)参数列表必须不相同

(3)返回值类型可以不相同

public void Sleep(){
cw("Animal睡觉");
}
public int sleep(){
cw("Animal几点睡觉");
}
public void Sleep(int time)
{
cw("Animal{0}点睡觉",time);
} 

2、重写:子类中满足自己的需要来重复定义某个方法的不同实现,需要用override关键字,被重写的方法必须是虚方法,用的是virtual关键字。

(1)相同的方法名。

(2)相同的参数列表。

(3)相同的返回值。

父类中的定义:
public virtual void EatFood()
{
cw("Animal吃东西") ;
} 子类中的定义
public override void EatFood(){
cw("cat吃东西");
}

tips:虚方法能直接被调用

4、抽象方法:在基类中定义的并且在派生类中重写的方法,使用abstract关键字定义。如:

基类:
public abstract class Biology
{
public abstract void Live();
} 子类
public class Animal:Biology
{
public override void Live()
{
cw("Animal重写的抽象方法");
}
} tips :抽象类中可以包含抽象类,也可以包含已经实现的。
已经实现的类不能包含抽象类。

5、隐藏方法:在派生类中定义的和基类中的某个方法同名的方法,使用new关键字定义。如在基类Animal中有一方法sleep();

  public void Sleep(){
cw("Animal Sleep");
} 在派生类cat中定义隐藏方法的代码为:
new public void Sleep(){
cw("Cat Sleep");
}

public new void Sleep()
{
cw("Cat Sleep");
} tips:(1)隐藏方法不但可以隐藏基类中的虚方法,而且可以隐藏基类中的非虚方法
(2)隐藏方法中父类的实例调用父类的方法,子类的实例调用子类的方法
(3)和上条对比:重写方法中子类的变量调用子类重写的方法,父类的变量要看这个父类引用的是子类的实例还是本身的实例,如果调用的是父类的实例,那么调用基类的方法,如果引用的是派生类的实例,则调用派生类的方法。 详细解说:
class Program
{
static void Main(string[] args)
{
//Animal 的实例
Animal a = new Animal();
a.EatFood();
//Animal 的实例,引用派生类Cat对象
Animal ac = new Cat();
ac.EatFood();
ac.Sleep(); Cat c = new Cat();
c.Sleep();
//Animal的实例,引用派生类Dog对象
Animal ad = new Dog();
Console.ReadKey(); }
} public abstract class Biology
{
public abstract void Live();
} public class Animal : Biology
{
public override void Live()
{
Console.WriteLine("Animal重写的Live");
} public void Sleep()
{
Console.WriteLine("Animal Sleep");
} public int Sleep(int time)
{
Console.WriteLine("Animal在{0}点Sleep",time);
return time;
} public virtual void EatFood()
{
Console.WriteLine("Animal EatFood");
}
} public class Cat : Animal
{
public override void EatFood()
{
Console.WriteLine("Cat EatFood");
}
new public void Sleep()
{
Console.WriteLine("Cat Sleep");
}
} public class Dog : Animal
{
public override void EatFood()
{
Console.WriteLine("Dog EatFood");
}
} 父类 animal 子类 cat
当出现 Animal a=new Cat(); 时,调用的是父类的 的方法。
当出现 Cat c=new Cat();时,调用的是子类的隐藏方法。

  

C#的多态性的更多相关文章

  1. javaScript的原型继承与多态性

    1.prototype 我们可以简单的把prototype看做是一个模版,新创建的自定义对象都是这个模版(prototype)的一个拷贝 (实际上不是拷贝而是链接,只不过这种链接是不可见,给人们的感觉 ...

  2. Java多态性——分派

    一.基本概念 Java是一门面向对象的程序设计语言,因为Java具备面向对象的三个基本特征:封装.继承和多态.这三个特征并不是各自独立的,从一定角度上看,封装和继承几乎都是为多态而准备的.多态性主要体 ...

  3. 【C++】多态性(函数重载与虚函数)

    多态性就是同一符号或名字在不同情况下具有不同解释的现象.多态性有两种表现形式: 编译时多态性:同一对象收到相同的消息却产生不同的函数调用,一般通过函数重载来实现,在编译时就实现了绑定,属于静态绑定. ...

  4. java多态性,父类引用指向子类对象

    父类引用指向子类对象指的是: 例如父类Animal,子类Cat,Dog.其中Animal可以是类也可以是接口,Cat和Dog是继承或实现Animal的子类. Animal animal = new C ...

  5. 『c++』 模板(template)--- 参数化多态性

    ---恢复内容开始--- 题外话: 模板机制的设计和细节是由Bjarne Stroustrup在其1988年10月发表的名为“Parameterized Types for C++”一文中披露的. 引 ...

  6. Java对象的多态性(转型)

    多态性在面向对象中主要有两种体现: <1>方法的重载与覆写 <2>对象的多态性 对象的多态性:向上转型:子类对象-->父类对象,向上转型会自动完成 向下转型:父类对象-- ...

  7. 【转】C++多态性

    ----转自http://blog.csdn.net/hackbuteer1/article/details/7475622 C++编程语言是一款应用广泛,支持多种程序设计的计算机编程语言.我们今天就 ...

  8. 浅谈C++多态性

    本文转载至http://blog.csdn.net/hackbuteer1/article/details/7475622 总结: (1)区分概念:    重载----同一个类中,相同的函数名字,不同 ...

  9. Java基础之在窗口中绘图——利用多态性使用鼠标自由绘图(Sketcher 7 with a crosshair cursor)

    控制台程序. 在Sketcher中创建形状时,并不知道应该以什么顺序创建不同类型的形状,这完全取决于使用Sketcher程序生成草图的人.因此需要绘制形状,对它们执行其他操作而不必知道图形是什么.当然 ...

  10. java多态性

    多态分两种: (1)   编译时多态(设计时多态):方法重载. (2)   运行时多态:JAVA运行时系统根据调用该方法的实例的类型来决定选择调用哪个方法则被称为运行时多态.(我们平时说得多的事运行时 ...

随机推荐

  1. TFTP服务

    $ mkdir /tftpboot$ cp exynos4412-fs4412.dtb uImage /tftpboot$ sudo chmod 777 tftpboot(~下)$ sudo chmo ...

  2. javaweb--HTTP状态码

    HTTP状态码(HTTP Status Code) 一些常见的状态码为: 200 - 服务器成功返回网页 404 - 请求的网页不存在 503 - 服务不可用 所有状态解释:点击查看 1xx(临时响应 ...

  3. [办公自动化]一次制作、多场合多次使用的PPT

    面试或汇报总结时,你可能需要制作一份PPT来介绍自己.但是这些场合你不一定能讲完所有的内容. 你可以尝试分1分钟.3分钟.5分钟.10分钟的版本来准备. 使用同一份PPT. 没错. 在office20 ...

  4. loadrunner获取返回值为乱码

    找了很多方法,utf-8也设置了,还是不行,只有有转码方法了 web_reg_save_param("res2", "LB=\"msg\":\&quo ...

  5. php执行root命令

    一.确定php的sysem等函数可用 二.编写c程序,如ipt.c #include <stdio.h>#include <stdlib.h>#include <sys/ ...

  6. securtcrt session配置转xshell的session配置

    参数: 1.securtcrt的session目录 2.一个xshell的模版文件 3.输出目录(必须不存在,自动创建) #!/usr/bin/python # -*- coding:utf-8 -* ...

  7. soap和wsdl的定义

    SOAP(Simple Object Access Protocol)是一个严格定义的信息交换协议,用于在Web Service中把远程调用和返回封装成机器可读的格式化数据.事实上SOAP数据使用XM ...

  8. javascript中的真假值、数据类型判断以及+的特殊用法

    一.javascript中的假值 jQuery中拥有一组数量奇大的假值,包括 0,NaN(非数),''(空字符串),false,null,undefined 这些值在if判断中全部等于假,但这些值彼此 ...

  9. ubuntu安装eclipse配置jdk环境

    $ sudo mkdir /usr/local/java //在此目录下新建一个文件夹java $ sudo mv 下载/jdk-8u111-linux-i586.tar.gz /usr/local/ ...

  10. 树的Prufer 编码和最小生成树计数

      Prufer数列 Prufer数列是无根树的一种数列.在组合数学中,Prufer数列由有一个对于顶点标过号的树转化来的数列,点数为n的树转化来的Prufer数列长度为n-2.它可以通过简单的迭代方 ...