C#抽象方法和虚拟方法理解
http://www.cnblogs.com/denylau/archive/2010/04/11/1709573.html
http://www.cnblogs.com/naariah/archive/2011/07/13/2105255.html
http://www.cnblogs.com/kdalan/archive/2012/05/29/2523470.html
http://www.cnblogs.com/lykbk/archive/2012/06/01/lyk19900723_daima3.html
http://www.cnblogs.com/qq4004229/archive/2012/10/23/2735477.html
首先在C#中虚方法的定义:
public virtual void VirtualMethod(){......};
只要在方法名前加上virtual,就声明了该方法为虚方法,注意声明为虚方法后再不能加上abstract,static关键字声明
以下是插入一个实例来说明虚方法与非虚方法的不同
public class A
{
public virtual void VirMethod()
{
Console.WriteLine("Virtual Method A");
}
public void NormalMethod()
{
Console.WriteLine("Normal Method A");
}
}
public class B : A
{
public override void VirMethod()
{
Console.WriteLine("Virtual Method B");
}
public new void NormalMethod()
{
Console.WriteLine("Normal Method B");
}
}
在main函数中执行:
B b = new B();
A a = b;//将派生类的实例赋给基类的对象
a.VirMethod();
a.NormalMethod();
b.VirMethod();
b.NormalMethod();
Console.ReadKey();
执行结果:Virtual Method B
Normal Method A
Virtual Method B
Normal Method B
通过结果表示 a.VirMethod() 虚方法是执行了B类的重写的方法;
a.NormalMethod();非虚方法还是执行了A类本身的方法;
A a = b 这步操作是通过派生类的实例来构造基类的对象,基类指针实际上是指向派生类的对象;所以a.VirMethod()这一步调用的是派生类重写了的方法。
而a.NormalMethod() 还是调用基类的方法
(在这里插下:override是重写了基类的虚方法,new 是新创建一个方法,就是与基类同名而已,但还是子类的自已的方法)
override是重载(有的翻译为覆盖),new是隐藏。
再补充一下:A a = b; 其中A是声明类,B是实例类
在调用函数的时候,系统是先去看声明类,如果函数不是虚函数,就直接调用声明类的,如果是虚函数,它会转去检查对象的实例类.(个人觉得挺有道理的)
如果继承是面向对象设计理论的基石,那么抽象理论和方法就是继承理论的顶梁柱。在汉语词典中抽象是这样解释的:将几个有区别的物体的共同特性或形象抽取出来或孤立地进行考虑的行动或过程。可以看出,抽象就是从事物中提取特征和性质,并不是事物本身。具体应该如何理解呢?
大家都知道,学生有一个共同的特征是必须学习,那么学什么,如何学,每一个学生就不一样了。这样可以提取学习这个动作为抽象方法,而不考虑具体内容。动物类都有叫的动作,具体动物如何叫,暂不考虑,先把共性提取出来。简单地说,用来描述这些共性的类就是抽象类,抽象类中不考虑具体实现,只确定必须具有的行为,就是抽象方法。
抽象方法是一个没有实现的方法,使用关键字abstract定义抽象方法。语法如下:
<访问修饰符> abstract 返回类型 方法();
例如:
public abstract void Cry();
当一个实例方法声明中含有abstract修饰符时,称之为抽象方法(abstract methods)。抽象方法只允许在抽象类中声明,但是并不能实现,抽象方法声明中只包含方法的签名,抽象方法在其派生类中使用override关键字来重写。在抽象方法声明中,不允许出现static、virtual或override中的任一修饰符。
注意:和普通方法不同,抽象方法没有闭合大括号,在方法括号后面直接加“;”号,表明抽象方法中没有方法体,即没有具体的实现。
C#抽象方法和虚拟方法理解的更多相关文章
- C#学习系列-抽象方法与虚拟方法的区别
参考:http://www.microsoftvirtualacademy.com/Content/ViewContent.aspx?et=9851&m=9838&ct=31054 如 ...
- C#通过完整的例子,Get常用的2个套路,理解抽象方法,虚方法,接口,事件
一.理解:抽象方法,虚方法,接口,事件 描述: 1.定义一个抽象父类"People": 要求: 1>3个属性:名字,性别,年龄: 2>一个普通方法"说话&qu ...
- LVS专题-(3) 虚拟ip理解
1.虚拟IP是什么? 要是单讲解虚拟 IP,理解起来很困难,所以干脆把 动态 IP .固定 IP .实体 IP 与虚拟 IP都讲解一下,加深理解和知识扩展 实体 IP:在网络的世界里,为了要辨识每一部 ...
- Android 自定义 view(四)—— onMeasure 方法理解
前言: 前面我们已经学过<Android 自定义 view(三)-- onDraw 方法理解>,那么接下我们还需要继续去理解自定义view里面的onMeasure 方法 推荐文章: htt ...
- lazarus的动态方法和虚拟方法
动态方法和虚拟方法在delphi里面分别表示: 动态方法 当需要调用父类.祖先类的被覆盖方法的时候,是查找继承树,当找到,就调用.减少了VMT占用,但调用慢一些. 虚拟方法 和动态方法不同的是,记录了 ...
- OO 抽象方法与虚方法的区别
抽象方法与虚方法的区别 抽象方法与虚方法的区别: 一.抽象方法: 1.只能在抽象类中定义: 2.不能有方法的实现:(方法体)[因为抽象类无法实例化,所以抽象方法没有办法被调用,也就是说抽象方法永远不 ...
- C#中抽象方法与虚方法的区别
一.抽象方法:只在抽象类中定义,方法修饰符不能使用private,virtual,static. 抽象方法如下示: public abstract class People //声明一个抽象类 { ...
- C#中抽象方法与虚方法的区别(转)
C#中抽象方法与虚方法的区别 一.抽象方法:只在抽象类中定义,方法修饰符不能使用private,virtual,static. 抽象方法如下示: public abstract class Peo ...
- 多态,虚拟方法,重写,接口,类库,委托,is,as运算符,泛型集合,万能变量
多态:简而言之就是龙生九子,各有不同 有了继承,才有了多态 1.虚方法 virtual重写 override父类中的方法,在子类中并不适用,那么子类需要自主更改继承的方法或者是属性,那父类中加了vir ...
随机推荐
- Java图片转换为base64格式
/** * @Descriptionmap 将图片文件转化为字节数组字符串,并对其进行Base64编码处理 * @author temdy * @Date 2015-01-26 * @param pa ...
- sun公司的jstl标签库
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...
- Grandle全局变量定义及引用
在Project的build.gradle脚本中定义一些全局变量 ext { compileSdkVersion = 21 buildToolsVersion = "24.0.1" ...
- 安装oracle 11g时出现启动服务出现错误,找不到OracleMTSRecoveryService
运行注册表(cmd-输入regedit),到 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services下,找到OracleMTSRecoveryServ ...
- mysql 查询成本
SELECT SQL_NO_CACHE spu from dp_distributor_products_1_online where dpId > 15 AND dpId <= 60; ...
- CentOS下PHP7的编译安装,MySQL的支持和一些问题的解决
最近试了一下PHP7,在编译和支持MySQL上都遇到一些问题,相信不少同学也同样遇到,所以在这里聊一下这个过程.简单来讲编译PHP7只需要3步: 1../buildconf --force 2../c ...
- imx6 usb otg config 配置
imx6 usb的host和slave配置,配置之后,安装gadget模块,就能够在host和slave之间切换. 参考文档: i.MX 6Dual/6Quad Linux Reference Man ...
- varsh4.1 安装清除cache
yum install automake autoconf ncurses-devel libxslt groff pkgconfig python-docutils readline-devel - ...
- RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.0 版本新增序列管理
欲了解V3.0版本的相关内容可查看下面的链接地址. RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.0 版本发布 在V3.0版本的Web(Mvc.WebForm)与WinF ...
- 替换jenkins上打包完成的安装包的方法
修改 /root/.jenkins/jobs/Item名称/lastSuccessful/archive/*/obj 文件夹下的文件,就可以在下图二中下载新修改的文件,需要注意的是,此文件夹下不能有新 ...