C#的多态性
参考网址: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#的多态性的更多相关文章
- javaScript的原型继承与多态性
1.prototype 我们可以简单的把prototype看做是一个模版,新创建的自定义对象都是这个模版(prototype)的一个拷贝 (实际上不是拷贝而是链接,只不过这种链接是不可见,给人们的感觉 ...
- Java多态性——分派
一.基本概念 Java是一门面向对象的程序设计语言,因为Java具备面向对象的三个基本特征:封装.继承和多态.这三个特征并不是各自独立的,从一定角度上看,封装和继承几乎都是为多态而准备的.多态性主要体 ...
- 【C++】多态性(函数重载与虚函数)
多态性就是同一符号或名字在不同情况下具有不同解释的现象.多态性有两种表现形式: 编译时多态性:同一对象收到相同的消息却产生不同的函数调用,一般通过函数重载来实现,在编译时就实现了绑定,属于静态绑定. ...
- java多态性,父类引用指向子类对象
父类引用指向子类对象指的是: 例如父类Animal,子类Cat,Dog.其中Animal可以是类也可以是接口,Cat和Dog是继承或实现Animal的子类. Animal animal = new C ...
- 『c++』 模板(template)--- 参数化多态性
---恢复内容开始--- 题外话: 模板机制的设计和细节是由Bjarne Stroustrup在其1988年10月发表的名为“Parameterized Types for C++”一文中披露的. 引 ...
- Java对象的多态性(转型)
多态性在面向对象中主要有两种体现: <1>方法的重载与覆写 <2>对象的多态性 对象的多态性:向上转型:子类对象-->父类对象,向上转型会自动完成 向下转型:父类对象-- ...
- 【转】C++多态性
----转自http://blog.csdn.net/hackbuteer1/article/details/7475622 C++编程语言是一款应用广泛,支持多种程序设计的计算机编程语言.我们今天就 ...
- 浅谈C++多态性
本文转载至http://blog.csdn.net/hackbuteer1/article/details/7475622 总结: (1)区分概念: 重载----同一个类中,相同的函数名字,不同 ...
- Java基础之在窗口中绘图——利用多态性使用鼠标自由绘图(Sketcher 7 with a crosshair cursor)
控制台程序. 在Sketcher中创建形状时,并不知道应该以什么顺序创建不同类型的形状,这完全取决于使用Sketcher程序生成草图的人.因此需要绘制形状,对它们执行其他操作而不必知道图形是什么.当然 ...
- java多态性
多态分两种: (1) 编译时多态(设计时多态):方法重载. (2) 运行时多态:JAVA运行时系统根据调用该方法的实例的类型来决定选择调用哪个方法则被称为运行时多态.(我们平时说得多的事运行时 ...
随机推荐
- SQL Server 存储过程(转)
Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句.这样就可以提高存储过程的性能. Ø ...
- You and Your Research(Chinese)
转自:http://lyxh-2003.iteye.com/blog/434014 这是大科学家Richard Hamming的著名讲演,于1986年在贝尔通讯研究中心给200多名Bellcore的科 ...
- yield return的用法简介
使用yield return 语句可一次返回一个元素. 迭代器的声明必须满足以下要求: 返回类型必须为 IEnumerable.IEnumerable<T>.IEnumerator 或 I ...
- [daily][troubleshoot][archlinux][wps][font] wps文档中的图内容无法显示中文
序 用linux作为工作生产环境的几个需要解决的问题之一是:文档协作,即如何兼容Micro$oft Office格式的文档. 我一般的工作方式是:在linux下创建一个win7的虚拟机,安装常用的wi ...
- MySQL创建数据库并赋予权限
1.创建一个mysql用户并设置密码create user 'MySql用户名'@'localhost' identified by '密码';2.限制账户资源grant usage on *.* t ...
- Javascript模块化编程(二):AMD规范 作者: 阮一峰
声明:转载自阮一峰的网络日志 这个系列的第一部分介绍了Javascript模块的基本写法,今天介绍如何规范地使用模块. (接上文) 七.模块的规范 先想一想,为什么模块很重要? 因为有了模块,我们就可 ...
- Hadoop学习笔记(一)从官网下载安装包
Hadoop是一个分布式系统基础架构,由Apache基金会所开发.用户可以在不了解分布式底层细节的情况下,开发分布式程序.充分利用集群的威力进行高速运算和存储.要学习Hadoop从下载安装包开始 打开 ...
- Python之路-python(set集合、文本操作、字符编码 )
一.集合操作(set) ...
- cocos2dx 3.x(实现帧动画(人物动画,跑马灯效果)的几种方法)
//创建一个跑酷的精灵 auto sprite = Sprite::create("1.png"); //设置精灵的坐标 sprite->setPosition(Ve ...
- erlang note
没有关于erlang interface ,继续寻找吧... --------------------------------------------------------------- erl - ...