【C#】什么时候使用virtual什么时候使用abstract,(另附override/new区别)
一、C#中virtual与abstract的区别(引用“姓吕名布字子乔”的文章)
C#的virtual & abstract经常让人混淆,这两个限定词都是为了让子类进行重新定义,覆盖父类的定义。但是用法上差别很大。
a) virtual修饰的方法必须有方法实现(哪怕只有一对大括号),abstract修饰的方法不能有实现。
b) virtual可以被子类重写,abstract必须被子类重写
c) 如果类中的某一函数被abstact修饰,则类名也必须用abstact修饰
d) Abstract修饰的类不能被创建实例。
e) C#中如果准备在子类重写父类的方法,则该方法在父类中必须用virtual修饰,在子类中必须用overide修饰,避免了程序员在子类中不小心重写了父类父类方法。
注:用abstract修饰的类只能被继承不能够被实例化。
二、什么时候使用virtual什么时候使用abstract
a) virtual重点是实现多态,同一个方法能做不同的事情,也就是当一个方法会有不同的操作的时候要用virtual,例如:支付方法 pay(),可能通过微信去支付、也可能通过支付宝或者其他方式去支付,这个时候定义pay()方法的时候最好是用virtual修饰。
b) 作为一个必须存在的方法的时候用abstract,比如要定义一个人类对象Class Person{}和一个鸟类对象Class Bird{},人是动物,鸟也是动物,所以一般会先定义一个共同的基类Class animal{},然后让人类和鸟类对象都继承这个基类。这个基类可以有共通的属性和方法,比如行走方法walk(),发声方法voice(),在基类中这两个方法都是不需要实现的,只需要在Person和Bird类中实现就可以了【Person和Bird类必需要实现这两个方法,这也保证了所有继承animal类的类都需要有walk()和voice()方法】,所以定义walk()和voice()方法的时候可以用abstract修饰
附、override/new区别
Base b1 = new Base();
A a = new A();
Base b2 = new A();//关键是这行代码 //以下4行代码输出的跟你预想的完全一样
var b1Foo1 = b1.Foo1(); //输出 base1
var b1Foo2 = b1.Foo2(); //输出 base2
var nFoo1 = a.Foo1(); //输出 Override
var nFoo2 = a.Foo2(); //输出 New //但下面两行可能会有点区别
var b2Foo1 = b2.Foo1(); //Override (override:b2虽是Base,但在A类里重写了Foo1方法,所以调用的是A.Foo1())
var b2Foo2 = b2.Foo2(); //base2 (new:b2是Base,但在A类里并没有重写Foo2方法,所以调用的是Base.Foo1()) //总结:当基类对象实例化的是派生类,则:
//1、函数用override修饰,则调用的就是派生类里的函数;
//2、函数用new修饰,则调用的依然是基类里的函数,因为 new表示是新的函数,跟基类里同名的那个函数没有任何关系
public class A : Base
{
public override string Foo1()
{
return "Override";
}
public new string Foo2()
{
return "New";
}
} public class Base
{
public virtual string Foo1()
{
return "base1";
}
public virtual string Foo2()
{
return "base2";
}
}
【C#】什么时候使用virtual什么时候使用abstract,(另附override/new区别)的更多相关文章
- Delphi之静态方法,虚方法virtual,动态dynamic,抽象abstract,消息
Delphi之静态方法,虚方法virtual,动态dynamic,抽象abstract,消息 http://www.cnblogs.com/zhwx/archive/2012/08/28/266055 ...
- c#什么时候使用virtual什么时候使用abstract
一.C#中virtual与abstract的区别(引用"姓吕名布字子乔"的文章) C#的virtual & abstract经常让人混淆,这两个限定词都是为了让子类进行重新 ...
- Abstract和Virtual和interface , 派生类中重写 override / new关键字
http://www.cnblogs.com/blsong/archive/2010/08/12/1798064.html C#中Abstract和Virtual 在C#的学习中,容易混淆virtua ...
- C#多态;父类引用指向子类对象;new和override的区别;new、abstract、virtual、override,sealed关键字区别和使用代码示例;c#类的初始化顺序
关于父类引用指向子类对象 例如: 有以下2个类 public class Father { public int age = 70; public static string name = " ...
- C#中virtual(虚方法)的理解以及和abstract(抽象方法)的区别
Virtual方法(虚方法) virtual 关键字用于在基类中修饰方法.virtual的使用会有两种情况: 情况1:在基类中定义了virtual方法,但在派生类中没有重写该虚方法.那么在对派生类实例 ...
- 抽象方法(abstract method) 和 虚方法 (virtual method), 重载(overload) 和 重写(override)的区别于联系
1. 抽象方法 (abstract method) 在抽象类中,可以存在没有实现的方法,只是该方法必须声明为abstract抽象方法. 在继承此抽象类的类中,通过给方法加上override关键字来实现 ...
- Partial(部分方法,局部方法),virtual(虚方法),abstract(抽象方法)
Partial 部分方法顾明思议是方法的一部分,不完整的,在ide编译时候,会将所有部分方法加载到一起统一编译,如果分部方法没有被实现,编译器就不会.对他们进行编译. 局部类型的限制 (1) 局部类型 ...
- c#中virtual, abstract和override的区别和用法
virtual是把一个方法声明为虚方法,使派生类可重写此方法,一般建立的方法是不能够重写的,譬如类A中有个方法protected void method(){ 原代码....;}类B继承自类A,类B能 ...
- 转载 [c#] 虚函数(Virtual),抽象函数(abstract)和接口的区别
1.virtual:允许被重写,但不强制要求.声明时提供其自身实现: 2.abstract:强制要求其继承者重写.声明时不提供其自身的实现,抽象类不能被实例化: 3.interface:接口就是协议, ...
随机推荐
- tomcat 部署项目的多种方式
项目放在tomcat webapps也不会加载两次 下面可以指定项目名称及path 加载war 部署war包 后面不用加war的后缀 <Host appBase="D:/pr ...
- Struts错误信息回传
<td height="20" align="center" class="loginMiddleDiv_loginInfo_window_wa ...
- java 获取路径
1.利用System.getProperty()函数获取当前路径:System.out.println(System.getProperty("user.dir"));//user ...
- 开发工具、Object类(java基础知识十一)
1.常见开发工具介绍 * A:操作系统自带的记事本软件 * B:高级记事本软件 * C:集成开发环境 IDE * (Integrated Development Environment) * ...
- Oracle备份与恢复:RMAN
今天第一次学习RMAN的使用.先登录系统: 数据库未启动,rman命令不能执行.在rman下 也可以 startup . 全库备份的命令:backup database 查看备份集. 下面模拟,数据 ...
- MYSQL数据库学习----MYSQL函数
MYSQL函数分为几种 数学函数 字符串函数 日期和时间函数 条件判断函数 系统信息函数 加密函数 格式化函数 一:数学函数 主要使用的几个数学函数 1 ABS()----绝对值函数 eg. SELE ...
- Spring中的扩展点
Spring作为一个常用的IOC框架,在设计上预留了很多的扩展点,很多第三方开源框架,包括Spring自身也是基于这些扩展点实现的,这很好的体现了对修改关闭.对扩展开放的原则.总的来说Spring的扩 ...
- 洛谷P1466集合——背包
题目:https://www.luogu.org/problemnew/show/P1466 水题,注意开long long; 代码如下: #include<iostream> #incl ...
- laravel5.2 增加Caffienate Modules,实现模块化开发
1.模块化开发可以把框架分成 Topc前台模块,Topm手机端前台,Admin后台管理模块,每个模块中都有自己的一套Controller,Logic,router等. 2.咖啡因模块是一个简单的包,以 ...
- excel中需要熟练掌握技能
一.排版篇: 给他人发送excel前,请尽量将光标定位在需要他人首先阅览的位置,例如Home位置(A1),例如结论sheet,长表尽量将位置定位到最顶端 有必要的时候请冻结首行:没必要但可追究的内容, ...