C# abstract ,virtual ,override,new --比较好的文章
http://www.cnblogs.com/notifier/archive/2010/05/14/1735235.html
1. C#中方法覆盖时override和new的比较
C#中override关键字使用在虚函数(virtual method)和抽象函数(abstract method)的覆盖上;
C#中new关键字使用在派生类覆盖父类的"普通"函数上(也就是说非虚函数非抽象函数的情境下)
下面是代码示例:(override的用法见下面abstract和virtual比较的章节)
using System;using System.Collections.Generic;using System.Text; namespace ConsoleApplication4{publicabstractclass Book {publicvoid Introduce() { Console.WriteLine("I'm book"); } publicvoid SayHi() { Console.WriteLine("Hi, I'm book"); } } publicclass JavaBook : Book {// 显式加上new,跟不加new实际效果一样,只是加new之后会消除compile warningpublicnewvoid SayHi() { Console.WriteLine("Hi, I'm Java"); } } publicclass test {public test() { JavaBook javaBook =new JavaBook(); Book book =new JavaBook(); javaBook.Introduce(); //将调用JavaBook中Introduce() javaBook.SayHi(); //将调用JavaBook中SayHi() book.Introduce(); //将调用Book中Introduce() book.SayHi(); //将调用Book中SayHi() }publicstaticvoid Main() { test t =new test(); } }}
2. C#中abstract和virtual的比较
abstract方法(抽象方法)和Java中的使用是一致的,至少我现在是这么理解.
virtual是C#中为了实现运行时多态而加的机制,上面有提到,子类可以覆盖父类的函数(使用override)从而实现多态.
这里岔个话题,笔记一下C#中多态的实现:C#中多态的实现分为了两种,一种是编译时多态,一种是运行时多态
|- 编译时多态 通过一个类中多个方法的重载来实现的多态,系统在编译的时候,根据传递的参数确定具体调用哪个重载的方法;
|- 运行时多态 通过virtual函数(虚函数)、抽象方法实现的多态,派生类去override虚函数或抽象方法,从而实现运行时多态.
具体实例代码如下:
第一段代码: abstract的用法
using System;using System.Collections.Generic;using System.Text; namespace ConsoleApplication3{publicabstractclass Book {//抽象方法,不含主体,抽象方法所在类必须为抽象类,派生类必须实现该方法publicabstractvoid Introduce(); } publicclass JavaBook : Book {//实现抽象方法,必须实现,注意!必须添加override关键字publicoverridevoid Introduce() { Console.WriteLine("I'm Java"); } } publicclass test {public test() { JavaBook javaBook =new JavaBook(); javaBook.Introduce(); //将调用JavaBook中Introduce() Book book =new JavaBook(); book.Introduce(); //将调用JavaBook中Introduce() }publicstaticvoid Main() { test t =new test(); } }}
第二段代码: virtual的用法以及override的用法
using System;using System.Collections.Generic;using System.Text; namespace ConsoleApplication2{publicabstractclass Book {publicvirtualvoid Introduce() { Console.WriteLine("I'm book"); } publicvirtualvoid SayHi() { Console.WriteLine("Hi, I'm book"); } } publicclass JavaBook : Book {publicoverridevoid Introduce() { Console.WriteLine("I'm Java"); } //注意,此方法没有override父类的方法publicvoid SayHi() { Console.WriteLine("Hi, I'm Java"); } } publicclass test {public test() { JavaBook javaBook =new JavaBook(); Book book =new JavaBook(); javaBook.Introduce(); //将调用JavaBook中Introduce() book.Introduce(); //将调用JavaBook中Introduce() javaBook.SayHi(); //将调用JavaBook中SayHi() book.SayHi(); //将调用Book中SayHi() } publicstaticvoid Main() { test t =new test(); } }}
转载于:https://www.cnblogs.com/runliuv/archive/2013/03/22/2974945.html
C# abstract ,virtual ,override,new --比较好的文章相关推荐
- c#中的interface abstract virtual override和new
from:(http://hi.baidu.com/21tian/blog/item/aabfae6ed4a675de81cb4ab4.html) interface用来声明接口 1.只提供方法的规则 ...
- 【C#】override,Abstract,Virtual 介绍及区别--转载
要扩展或修改继承的方法.属性.索引器或事件的抽象实现或虚实现,必须使用 override 修饰符. 1. override 方法提供从基类继承的成员的新实现.通过 override 声明重写的方法称为 ...
- Sealed,new,virtual,abstract与override的区别
1. Sealed: a) 密封类不能被继承. b) 密封方法可以重写基类中的方法,但其本身不能在任何派生类中进一步重写.当应用于方法或者属性时,sealed修饰符必须始终与Override一起使用. ...
- sealed、new、virtual、abstract与override 趣解
1. sealed--"断子绝孙"密封类不能被继承.密封方法可以重写基类中的方法,但其本身不能在任何派生类中进一步重写.当应用于 方法或属性时,sealed修饰符必须始终与over ...
- 谈谈C#中的三个关键词new , virtual , override(装载 Winner.Net)
C#支持单继承,说到继承就不得不说new,virtual和override这三个关键词,灵活正确的使用这三个关键词,可以使程序结构更加清晰,代码重用性更高. 以下是msdn中对new,virtual和 ...
- 谈谈C#中的三个关键词new , virtual , override
谈谈C#中的三个关键词new , virtual , override C#支持单继承,说到继承就不得不说new,virtual和override这三个关键词,灵活正确的使用这三个关键词,可以使程序结 ...
- C# selecd,new,virtual,abstract与override
本文大部分内容摘自 <.NET开发专家·亮剑.NET : .NET深入体验与实战精要> 博主只是搬运工,不喜勿喷. 关于虚方法,抽象类这一部分一直不是太清楚,目前的工作中也接触不到这些. ...
- 【原创】C# Sealed、new、virtual、abstract、override的理解
1.sealed 密封类不能被继承,密封方法可以重写基类中的方法,但其本身不能在任何派生类(子类)中 进一步重写.当应用于属性或者方法时,sealed 修饰符必须始终和override一同使用. 通俗 ...
- new,virtual,override,interface,delegate,event-------------C#——方法实现总结
C#--方法实现总结 本文分两部分来写,第一部分:C#方法实现的理解与问题,第二部分:C#中方法实现的种类. 第一部分:C#方法实现的理解与问题 理解: 1. 使用virtual和override关键 ...
- System Center Virtual Machine Manager 2012 SP1系列文章
部署SCVMM2012 SP1 集群(1)---部署AD http://fengxja.blog.51cto.com/1410070/1127626 部署SCVMM2012 SP1 集群(2)---部 ...
最新文章
- 生产异常反馈流程图_企业生产现场管理做到这些,想不成功都难
- github中SSH的Key
- 整体管理6个过程及相关重点
- 系统 销售订单号_销售单,进货单自动计算,一键保存的进销存管理系统,十分好用...
- java 对象转json,java首字母小写,判断方法是否为javabean方法
- [manacher] hdu 3294 Girls#39; research
- 参加第六届中国制造业MES应用年会
- 京沪等地11月房价半年来首涨 平价走量将成主流
- 01-jbpm工作流实现
- PLC江湖波澜不惊,自动化风云录!
- RabbitMQ使用手册中文
- 问卷设计二:问题设计要遵循哪些原则?
- namespace什么意思
- java complex_用java定义一个复数类Complex,能够创建复数对象,并且实现复数之间的加、减运算...
- 小米34寸带鱼屏显示器的耗电计算
- SKR EOS 竞猜游戏再遭攻击,黑客共获利约4000eos
- linux上的网络相关命令行
- lsdyna如何设置set中的node_list_如何理解vue的双向绑定
- Couldn't read row 0, col 0 from CursorWindow. Make sure the Cursor is initia
- ThinkCMF-上传多个图片源码解读
热门文章
- 几何画板构造象限平分线的步骤
- POJ 3415 Common Substrings (后缀数组,长度不小于k的公共子串的个数)
- 分支程序设计03 - 零基础入门学习C语言12
- Mysql 的ERROR 1005 (HY000): Can't create table 'xxx' (errno: 150)
- oracle 回表是什么,ORACLE回表
- element ui的table组件在鼠标滑动时边框线消失的解决
- ps 显示当前进程的状态
- python自动发帖源码_Python3实现的 自动发帖小工具 -电脑资料
- python语言的基本数据类型_python语言基本数据类型-深浅拷贝
- 计算机应用计算专业难吗,计算机应用专业好学吗