多态性(C#)
在面向对象编程中继承性和多态性是重要机制,前面我为大家分享了我对“类的继承”的理解,哪么今天我就跟大家分享下我对“多态性(C#)”的理解。
首先我们先来看看多态的定义,同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。
C#中多态分为两种形式,一种是编译的多态,一种是运行的多态;而所涉及到多态的有重载、重写、虚方法、抽象方法和隐藏方法。
下面来看看这一段代码,我们从代码中来分析他们的概念及区别:
public abstract class A
{
public abstract void prind();
}
public class B:A
{
public override void prind()
{
Console.WriteLine("我是B类,我重写了A类的抽象方法prind()");
}
public virtual void Bprind()
{
Console.WriteLine("我是B类中的虚方法,我可以被继承B类的派生类重写");
}
public void Nprind()
{
Console.WriteLine("Nprind");
}
}
public class C:B
{
public override Bprind()
{
Console.WriteLine("我重写了B类的虚方法Bprind");
}
new public void Nprind()
{
Console.WriteLine("我是隐藏Nprind");
}
/* 下面是另一种隐藏方法的表现形式
public new void Nprind()
{
Console.WriteLine("我是隐藏Nprind");
}
*/
public void Cprind()
{
Console.WriteLine("我是Cprind方法");
}
public void Cprind(string str)
{
Console.WriteLine(str+"我被重载了");
}
}
class D
{
static void Main(string []arge)
{
B b=new B();
B bc=new C();
C c=new C();
//重写抽象方法
b.prind();
//重写虚方法
b.Bprind();
bc.Bprind();
//隐藏方法
b.Nprind();
bc.Nprind();
c.Nprind();
//重载
bc.Cprind();
bc.Cprind("E");
Console.Read();
}
}
输出结果:
我是B类,我重写了A类的抽象方法prind()
我是B类中的虚方法,我可以被继承B类的派生类重写
我重写了B类的虚方法Bprind
Nprind
Nprind
我是隐藏Nprind
我是Cprind方法
E我被重载了
如果单看这段代码可能会看的很费力,所以我们来听听类他们之间的对话。
D:A类因为你是抽象类,所以你可以定义抽象方法,定义的抽象方法prind可以被继承你的子类重写;因此B类可以重写你的抽象方法prind。
A:我可以被继承我的子类B重写,哪么我也可以被其他的子类重写咯,也就是说我使用了多态性。
D:是的你使用了多态性中涉及的抽象方法,因为你的所有子类都可以对你的抽象方法重写,所以你符合了多态性的定义;但你的所有子类都要注意,重写你的抽象方法必须要用到override关键字、修饰符要相同、传递的参数个数和类型也都要一样及方法的返回值都要一样。
D:B类你自身的Bprind方法是虚方法也可以被继承你的子类重写,不过你和A类不同的是,你自身也可以调用这个虚方法。
B:为什么Bprind会是虚方法呢?它和别的方法也没什么不同啊,只是多了个virtual关键字而已,难道加了virtual关键字的就是虚方法?
D:对的,虚方法就是必须要加上virtual关键字,而没有加virtual或别的关键字的我们叫它为非虚方法;也是因为是虚方法才可以重写,非虚方法是不能重写的;但要注意只有继承你的子类才可以重写你的虚方法。
B:哦,所以C类可以重写我的Bprind这个虚方法。
D:C类你不但重写了父类B的虚方法,还把B类中的Nprind方法写在了隐藏方法了,而已还对自身的Cprind方法进行了重载。
C:听到你跟A、B类的对话我知道了我是重写了虚方法,但这个隐藏方法和重载了Cprind方法,又是什么回事呢?
D:隐藏方法和重写方法差不多,只是关键字不是override,而改成了new;还有不同的是new可以在修饰符前或后。而重载是在同一个作用域中使用了相同的方法名,修饰符、返回值、参数都可以不相同。
C:隐藏方法我自己能调用吧,但如果实例化父类时引用的是我,哪么调用的应该是我的还是父类的方法呢?
D:隐藏方法你自己可以,但只有是对你自己实例时调用的才是你,而如果父类实例时引用的是你,哪么调用的将是父类的方法。
首先我们先从他们对话和给合代码来看看,重载与重写的区别:
重载: 重写:
修饰符 可以不同 必须相同
参数个数及类型 可以不同 必须相同
返回值 可以不同 必须相同
方法名 必须相同 必须相同
接下来我们来看看抽象方法、隐藏方法、虚方法的注意事项:
抽象方法:
1.在基类中定义,派生类中重写。
2.抽象方法只有在抽象类中才可使用。
3.抽象类不能实例化。
4.必须使用abstract。
隐藏方法:
1.派生类中定义的和基类中的某个方法名相同。
2.父类调用父类的方法,而子类调用子类的方法。
3.使用new关键字,虚方法也能使用。
虚方法:
1.在父类中定义的,子类可以重写。
2.使用virtual关键字。
注:父类自身也可调用。
多态性(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运行时系统根据调用该方法的实例的类型来决定选择调用哪个方法则被称为运行时多态.(我们平时说得多的事运行时 ...
随机推荐
- 只有第三方控件pas代码生成控件
如果他人的VCl控件只有pas代码,如何生成控件? 步骤:1.new Pakage(bpl ) 2.在Contains中Add VCl***.pas 3.再Complie ,Install 即可 XE ...
- Java项目集成SAP BO
SAP BO报表查看需要登录SAP BO系统,为了方便公司希望将BO报表集成到OA系统中,所以参考网上资料加上与SAP BO的顾问咨询整理出一套通过Java来集成SAP BO的功能. SAPBO中的报 ...
- Phpcms安装前后域名默认访问路径
一.安装前 phpcms下载后index.html文件内容如下图,在本地服务器配置项目虚拟域名后,访问域名后直接跳到:域名/install/install.php,然后出现安装界面. 二.安装之后 提 ...
- hdu_5963:朋友
刚看到这题时感觉是树上博弈,然后我开始用一维的数据找规律.发现在一维的树上,如果把各边的值合在一起当成一个二进制数,那么,ans只与奇偶性有关,于是,我提出了一个比较大胆的假设:若连接在root上的所 ...
- ARM开发(2)基于STM32的蜂鸣器
基于STM32的蜂鸣器 一 蜂鸣器原理: 1.1 本实验实现1个蜂鸣器间隔1S鸣叫. 1.2 实验思路:根据电路图原理,给蜂鸣器相关引脚赋予高低电平,实现电路的导通,使蜂鸣器实现鸣叫或不鸣. 1 ...
- 为什么Java大数据是最火爆的编程语言?
未来10年将是大数据,人工智能爆发的时代,到时将会有大量的企业需要借助大数据,而Java最大的优势就是它在大数据领域的地位,目前很多的大数据架构都是通过Java来完成的. 在这个Android.iOS ...
- C# 添加、修改和删除PDF书签
C# 添加.修改和删除PDF书签 有时候我们在阅读PDF文档时会遇到这样一种情况:PDF文档页数比较多,但是又没有书签,所以我们不能根据书签快速了解文档所讲解的内容,也不能点击书签快速跳转到相应的位置 ...
- 【HTML】dl dt dd
摘要 看到没怎么使用过的html 标签,记录下 定义 dl 类似于 ul ,无任何样式,自定义列表容器, ul 为无序列表容器,ol 为有序列表容器 dt dd 类似于 li ,无任何样式,为帮助实现 ...
- Linux基本命令整理_sheng
Linux版本 Linux系统是一个多用户.多任务的分时操作系统. Linux版本分为内核版本和发行版本. 常见的Linux发行版有: RedHat(分为用于企业的Red Hat Enterprise ...
- 4. leetcode 461. Hamming Distance
The Hamming distance between two integers is the number of positions at which the corresponding bits ...