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运行时系统根据调用该方法的实例的类型来决定选择调用哪个方法则被称为运行时多态.(我们平时说得多的事运行时 ...
随机推荐
- 四个查找命令find,locate,whereis,which的区别
find最强大,但是检索硬盘,比较慢: whereis只能查二进制文件.说明文档,源文件等: locate能查所有文件,但跟whereis一样都是查数据库里的内容,速度快,但有延时: which 只能 ...
- 动态给drawable上色
只加载一个资源,然后在运行的时候通过ColorFilter进行上色 public Drawable colorDrawable(Resources res, @DrawableRes int draw ...
- wordpress 导航相关的函数
上一篇文章.下一篇文章 previous_post_link( $format = '« %link', $link = '%title', $in_same_term = false, $exclu ...
- iOS开发中常用到的宏定义
1.首次启动判断: #define First_Launched @"firstLaunch" 2.ios7系统判断: #define IsIOS7 ([[[UIDevice cu ...
- java中日历代码的实现
import java.util.Scanner; com.lv.calendarWatch//包名 /* * 需求:输入一个年份和月份 ,显示当前月日情况 ,星期数要对应准确 * 1.1900年1月 ...
- HTML其他基本格式说明
1.<!DOCTYPE>说明页面中使用的HTML版本,只是信息声明 2.元信息元素<meta>,通过属性定义文件信息的名称.内容.文档的关键字.作者及描述等..content内 ...
- Mac更换Sublime Text程序图标
更换方法: 下载.icns格式一个图标.http://www.easyicon.net/language.en/iconsearch/sublime/ 终端执行:open /Applications/ ...
- LeetCode Generalized Abbreviation
原题链接在这里:https://leetcode.com/problems/generalized-abbreviation/ 题目: Write a function to generate the ...
- Windows Server 2008 R2 创建辅助DNS服务器并接管主要DNS服务器
公司需求: Zhuyu公司局域网有一台主要DNS服务器,经领导讨论需要规划安装一台辅助DNS服务器备用. 功能需求: 当主要DNS服务器宕机或系统崩溃,辅助DNS服务器能接管主要DNS服务器工作,并且 ...
- JQuery 表单校验插件 validate 使用纪录
JS诞生其中一个目的就是将, 服务器端的校验在客户端提前完成, 以避免用户提交数据后, 后台校验报错的糟糕用户体验. 基于JQuery库的有很多优秀的插件, 其中对于浏览器端表单进行验证的基本功能也有 ...