类的虚拟方法与多态
来源:互联网 发布:ubuntu安装数据库 编辑:程序博客网 时间:2024/05/30 19:34
首先理解一下什么叫多态。同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。
多态性通过派生类覆写基类中的虚函数型方法来实现。
多态性分为两种,一种是编译时的多态性,一种是运行时的多态性。
编译时的多态性:编译时的多态性是通过重载来实现的。对于非虚的成员来说,系统在编译时,根据传递的参数、返回的类型等信息决定实现何种操作。
运行时的多态性:运行时的多态性就是指直到系统运行时,才根据实际情况决定实现何种操作。C#中运行时的多态性是通过覆写虚成员实现。
下面我们来分别说明一下多态中涉及到的四个概念:重载,覆写,虚方法和抽象方法。
重载和覆写的区别:
重载
类中定义的方法的不同版本
public int Calculate(int x, int y)
public double Calculate(double x, double y)
特点(两必须一可以)
方法名必须相同
参数列表必须不相同
返回值类型可以不相同
覆写
子类中为满足自己的需要来重复定义某个方法的不同实现。
通过使用override关键字来实现覆写。
只有虚方法和抽象方法才能被覆写。
要求(三相同)
相同的方法名称
相同的参数列表
相同的返回值类型
最后再来介绍一下虚方法和抽象方法
虚方法
声明使用virtual关键字。
调用虚方法,运行时将确定调用对象是什么类的实例,并调用适当的覆写的方法。
虚方法可以有实现体。
抽象方法
必须被派生类覆写的方法。
可以看成是没有实现体的虚方法。
如果类中包含抽象方法,那么类就必须定义为抽象类,不论是否还包含其他一般方法。
多态
面向对象的语言使用虚方法表达多态。这就意味着派生类可以有和父类具有同样签名的方法,并且父类可以调用派生类的方法【译注:此处应该是对象(或对象引用、指向对象的指针)】。在Java中,缺省情况下方法就是虚的。在C#中,必须使用virtual关键字才能使方法被父类调用。
在C#中,还需要override关键字以指明一个方法将重载(或实现一个抽象方法)其父类的方法。
Class B //【译注:应为class B】
{
public virtual void foo () {}
}
Class D : B //【译注:应为class D : B】
{
public override void foo () {}
}
试图重载一个非虚的方法将会导致一个编译时错误,除非对该方法加上“new”关键字,以指明该方法意欲隐藏父类的方法。
Class N : D //【译注:应为class N : D】
{
public new void foo () {}
}
N n = new N ();
n.foo(); // 调用N的foo
((D)n).foo(); // 调用D的foo
((B)n).foo(); // 调用D的foo
和C++、Java相比,C#的override关键字使得阅读源代码时可以清晰地看出哪些方法是重载的。不过,使用虚方法有利有弊。第一个有利点是:避免使用虚方法轻微的提高了执行速度。第二点是可以清楚地知道哪些方法会被重载。
【译注:从“不过”至此,这几句话显然不合逻辑,但原文就是如此:
“However, requiring the use of the virtual method has its pros and cons. The first pro is that is the slightly increased execution speed from avoiding virtual methods. The second pro is to make clear what methods are intended to be overridden.”。
我认为,若将被我标为斜体的method改为keyword的话,逻辑上会顺畅些。这样,第一句话就可认为是和Java比,因其方法缺省是虚的,第二句话主要是和C++比】。然而,利也可能是弊。和Java中缺省忽略final修饰符
【译注:在Java中可利用final关键字,对方法上锁,相当于C#/C++中没有用virtual关键字修饰方法/成员函数的情况】以及C++中缺省忽略virtual修饰符相比,Java中缺省选项
【译注:即虚的】使得你程序略微损失一些效率,而在C++中,它可能妨碍了扩展性,虽然这对基类的实现者来说,是不可预料的。
- 类的虚拟方法与多态
- C#抽象方法与虚拟方法的区别
- 虚拟机运行时常量池与String的intern方法
- C#多态性-虚拟方法实现多态
- C#多态性-虚拟方法实现多态
- C#类、接口、虚方法和抽象方法-虚拟方法与抽象方法之区别
- 虚拟函数与多态(Polymorphism)
- 虚拟中的多态与现实中多态
- 运用虚拟/抽象/接口实现多态的例子(-)--虚拟类.
- 虚拟主目录的建立方法
- 虚拟存储器的实现方法
- 虚拟按键的判断方法
- 抽象方法和虚拟方法的区别
- 在virtualBox的虚拟Redhat5.4与物理机共享文件夹的方法
- 在VirtualBox的虚拟Redhat5.4与物理机共享文件夹的方法
- 解决vsftpd虚拟用户与本地用户不能同时登陆的方法
- C++多继承与虚拟继承的内存布局
- C++类的多重继承与虚拟继承
- 商务英语——职位
- 从windows到linux的转换
- 什么是极限编程?什么是借口编程?什么是敏捷开发?
- ASP.NET 2.0防止同一用户同时登陆
- 两个log4j.properties文件
- 类的虚拟方法与多态
- cglib 指南
- linux进程启动时段寄存器的初始化 及意义
- GDI+ 在Delphi程序的应用 -- 多帧(页)图像动画播放
- MBR, disk partitioning, .... OS
- 计算机应用基础 操作系统初步 题库
- 一个关于java.net.Socket的超时的问题
- Hashtable和HashMap类的区别
- Window 消息大全使用详解