C#中抽象方法与虚方法的区别(转)
C#中抽象方法与虚方法的区别
一、抽象方法:只在抽象类中定义,方法修饰符不能使用private,virtual,static.
抽象方法如下示:
public abstract class People //声明一个抽象类
{
public abstract void study(); //抽象方法只能定义在抽象类中。
}
public class Student:People //继承抽象类
{
public override void study() //重写抽象类的抽象方法
{
Console.WriteLine("好好学习,天天向上!");
}
}
public class Program
{
static void Main(string[] args)
{
Student t= new Student();//实例化派生类
People p= t; //使用派生类对象实例化抽象类
//以上两句等价于 People p = new Student();//使用派生类对象实例化抽象类;
p.study(); //使用抽象类对象调用抽象类中的抽象方法study
}
}
总结:(1)象方法只能声明在抽象类中,使用关键字abstract
(2)抽象类中的抽象方法必须被子类重写。
【抽象方法没有方法体,子类必须重写方法体!!,因此抽象方法可以看成是一个没有方法体的虚方法】
二、虚方法:使用virtual修饰的方法:
虚方法可以有方法体。具体示例如下:
public class BaseClass //创建一个基类
{
public virtual string GetName() //使用virtual关键字创建父类中的虚方法
{
return "父类虚方法体":
}
}
public class SubClass:BaseClass //子类继承父类
{
public override string GetName(); //子类重写父类虚方法
{
return "重写父类虚方法!";
}
}
以上的示例:父类中的虚方法被派生类重写了。
注意事项:virtual修饰符不能与private、static、abstract、override修饰符同时使用。
ps:override修饰符不能与new 、static、virtual修饰符同时使用,并且重写方法只能用于重写基类中的虚方法。
虚函数的限制:
* 虚函数仅适用于有继承关系的类对象,所以只有类的成员函数才能说明为虚函数;
*静态成员函数、内联函数、构造函数不能是虚函数;
*析构函数可以是虚函数。
三、两者区别:
总结:抽象方法是只有方法名称,没有方法体(也就是没有方法具体实现),子类必须重写父类抽象方法;
虚函数是该方法有方法体,但是子类可以覆盖,也可不覆盖。
(1)虚方法有方法体,抽象方法没有方法体。抽象方法是一种强制派生类覆盖的方法,否则派生类将不能被实例化;
(2)抽象方法只能在抽象类中声明,虚方法不是;
(3)派生类必须重写抽象类中的抽象方法,虚方法则不必要。
C#中抽象方法与虚方法的区别(转)的更多相关文章
- C#中抽象方法与虚方法的区别
一.抽象方法:只在抽象类中定义,方法修饰符不能使用private,virtual,static. 抽象方法如下示: public abstract class People //声明一个抽象类 { ...
- OO 抽象方法与虚方法的区别
抽象方法与虚方法的区别 抽象方法与虚方法的区别: 一.抽象方法: 1.只能在抽象类中定义: 2.不能有方法的实现:(方法体)[因为抽象类无法实例化,所以抽象方法没有办法被调用,也就是说抽象方法永远不 ...
- C#通过完整的例子,Get常用的2个套路,理解抽象方法,虚方法,接口,事件
一.理解:抽象方法,虚方法,接口,事件 描述: 1.定义一个抽象父类"People": 要求: 1>3个属性:名字,性别,年龄: 2>一个普通方法"说话&qu ...
- C#中virtual(虚方法)的理解以及和abstract(抽象方法)的区别
Virtual方法(虚方法) virtual 关键字用于在基类中修饰方法.virtual的使用会有两种情况: 情况1:在基类中定义了virtual方法,但在派生类中没有重写该虚方法.那么在对派生类实例 ...
- 关于C#中的抽象类、抽象方法和虚方法的探究
2016年的第一篇文章,容我先喷喷新年的情怀,..........,好了,喷的差不多了. 在面向对象中,我们需要对类进行横向和纵向的认识,不同的类有不同特色的成员,同时在不同类的继承中,子类获得父类的 ...
- 浅谈C#抽象方法、虚方法、接口
每次写博客,第一句话都是这样的:程序员很苦逼,除了会写程序,还得会写博客!当然,希望将来的一天,某位老板看到此博客,给你的程序员职工加点薪资吧!因为程序员的世界除了苦逼就是沉默.我眼中的程序员大多都不 ...
- C#抽象类、抽象方法、虚方法
定义抽象类和抽象方法: abstract 抽象类特点: 1.不能初始化的类被叫做抽象类,它们只提供部分实现,但是另一个类可以继承它并且能创建它们的实例 2.一个抽象类可以包含抽象和非抽象方法,当一个类 ...
- Java线程中run和start方法的区别
http://bbs.csdn.net/topics/350206340 Thread类中run()和start()方法的区别如下:run()方法:在本线程内调用该Runnable对象的run()方法 ...
- 深入理解jQuery中live与bind方法的区别
本篇文章主要是对jQuery中live与bind方法的区别进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助 注意如果是通过jq添加的层和对象一定要用live(),用其他的都不起作用 ...
随机推荐
- 图数据库neo4j和关系数据库的区别
相信您和我一样,在使用关系型数据库时常常会遇到一系列非常复杂的设计问题.例如一部电影中的各个演员常常有主角配角之分,还要有导演,特效等人员的参与.通常情况下这些人员常常都被抽象为Person类型,对应 ...
- 数位DP入门题——[hdu2089]不要62
数位DP是我的噩梦. 现在初三了,却没AC过数位DP的题目. 感觉数位DP都是毒瘤-- 题目 hdu不用登录也可以进去,所以就不把题目copy到这里来了. 题目大意 求区间[n,m][n,m][n,m ...
- HZOI20190819模拟26题解
题面:https://www.cnblogs.com/Juve/articles/11376806.html A. 嚎叫响彻在贪婪的厂房: 是时候学习一下map和set的用法了...... 贪心:区间 ...
- [bzoj2654] tree 最小生成树kruskal+二分
题目描述 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树.题目保证有解. 输入格式 第一行V,E,need分别表示点数,边数和需要的白色边数.接下来E行, ...
- 【ZJOI2007】【BZOJ1059】矩阵游戏 匈牙利算法
题目描述 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏——矩阵游戏.矩阵游戏在一个N*N黑白方阵进行(如同国际象棋一般,只是颜色是随意的).每次可以对该矩阵进行两种操作:行交换 ...
- 历届试题_DNA比对
脱氧核糖核酸即常说的DNA,是一类带有遗传信息的生物大分子.它由4种主要的脱氧核苷酸(dAMP.dGMP.dCMT和dTMP)通过磷酸二酯键连接而成.这4种核苷酸可以分别记为:A.G.C.T. ...
- MyBatis配置文件(五)--objectFactory对象工厂
我们在使用MyBatis执行查询语句的时候,通常都会有一个返回类型,这个是在mapper文件中给sql增加一个resultType(或resultMap)属性进行控制.resultType和resul ...
- 多表关联懒加载导致的org.hibernate.LazyInitializationException: could not initialize proxy - no Session
本来考虑的是懒加载,这样可以提高效率,不过由于时间紧急 把懒加载改为急加载临时解决 https://www.jianshu.com/p/89520964f458 自己管理session也可以 临时补丁 ...
- Action详解
简介 Action 是用于处理请求操作的,它是由 StrutsPrepareAndExecuteFilter 分发过来的. 在 Struts2 框架中,Action 是框架的核心类,被称为业务逻辑控制 ...
- 解读Python中 locals() 和 globals() 内置函数
首先globals() 和 locals() 是作用于作用域下的内置函数,所以我将它们分为作用域类型的内置函数 1.作用域相关: 1)globals() # 返回全局作用域中的所有名字 2)local ...