C# selecd,new,virtual,abstract与override
本文大部分内容摘自 《.NET开发专家·亮剑.NET : .NET深入体验与实战精要》
博主只是搬运工,不喜勿喷。
关于虚方法,抽象类这一部分一直不是太清楚,目前的工作中也接触不到这些。
前几天下载了一本书,发现写的很形象,让我豁然开朗。
整理一下,再打一遍,加深理解,也帮助更多的初学者了解这部分知识。
1. sealed —— "断子绝孙"
密封类不能被继承。
密封方法可以重写基类中的方法。但其本身不能在任何派生类中进一步重写。
当应用于方法或属性时,scaled 修饰符必须同 override 一同使用。
2. new —— “我是你的,你是我的”
new 关键字用于显式隐藏从基类继承的成员,也就是说在使用派生类时调用的方法是 new 关键字新定义的方法,而不是基类的方法。
不使用 new 关键字隐藏成员也是可以的,但是会产生警告。使用 new 显式隐藏成员会取消次警告。
3. virtual —— “为了子孙和后代”
virtual 关键字用于修改方法或属性的声明,这种情况下,方法或属性被称作虚成员。虚成员的实现可又派生类中的重写成员更改。
调用虚方法时,将为重写成员检查该对象的运行时类型。将调用大部分派生类中的该重写成员,如果没有派生类重写该成员,则它可能是原始成员。
默认情况下,方法是非虚拟的。不能重写非虚方法。
virtual 修饰符不能与 static、abstract, private 或 override 修饰符一起使用。 除了声明和调用语法不同外,虚拟属性的行为与抽象方法一样。
通过使用override修饰符在派生类中重写虚拟继承属性。
4. abstract —— “我是上帝”
abstract修饰符可以和 类,方法,属性,索引器以及事件一起使用。
在类声明中使用abstract修饰符以指示该类只能是其他类的基类。
抽象类的特性:
- 抽象类不能实例化。
- 抽象类可以包含抽象方法和抽象访问器。
- 不能用sealed修饰符修改抽象类,这意味着该类不能被继承。
- 从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实现。
- 从方法或属性声明中使用abstract修饰符以指示此方法或属性不包含实现。
抽象方法的特性
- 抽象方法是隐式的 virtual 方法。
- 只允许在抽象类中使用抽象方法声明。
- 抽象方法声明不提供实际的实现,所以没有方法体,方法声明以 ; 结束,并且签名后没有 {} 符号。如 public abstract void MyMethod();
- 实现方法由overriding方法提供,它是非抽象类的成员。
- 在抽象方法声明中使用 static 或 virtual 修饰符是错误的。
- 除了在声明声明和调用方法上不同外,抽选属性的行为与抽象方法一样。
5. override —— "一手遮天"
使用override修饰符来修改方法,属性,索引器,或事件。主要提供派生类对基类方法的新实现,覆盖 abstract 与 virtual 两种修饰的成员。
重写的基类方法 必须与重写方法具有相同的签名。
重写的基类方法 必须是虚拟的,抽象的,或重写的。不能重写非虚方法或静态方法。
不能使用 new,static,virttual 和 abstract 关键字修改重写方法成员。
重写属性声明必须制定与继承属性完全相同的访问修饰符,类型,和名称。并且重写属性必须是虚拟的,抽象的,或重写的。
new 与 override 的相同点
- 都可以对基类成员进行隐藏,都可以使用 base 关键字调用基类成员
new 与 override 的区别
用 override 的基类的方法必须要用 virtual,而 new 不需要。
同一个基类对象调用基类的 virtual 方法时,override 重写的派生类的方法会被访问,而 new 重写的派生类的方法不会被访问。
C# selecd,new,virtual,abstract与override的更多相关文章
- sealed,new,virtual,abstract与override关键字的区别?
1. sealed——“断子绝孙” 密封类不能被继承.密封方法可以重写基类中的方法,但其本身不能在任何派生类中进一步重写.当应用于方法或属性时,sealed修饰符必须始终与override一起使用. ...
- c#中virtual, abstract和override的区别和用法
virtual是把一个方法声明为虚方法,使派生类可重写此方法,一般建立的方法是不能够重写的,譬如类A中有个方法protected void method(){ 原代码....;}类B继承自类A,类B能 ...
- sealed、new、virtual、abstract与override 趣解
1. sealed——“断子绝孙” 密封类不能被继承.密封方法可以重写基类中的方法,但其本身不能在任何派生类中进一步重写.当应用于 方法或属性时,sealed修饰符必须始终与override一起使用. ...
- sealed、new、virtual、abstract与override 总结
1. sealed——“断子绝孙” 密封类不能被继承.密封方法可以重写基类中的方法,但其本身不能在任何派生类中进一步重写.当应用于方法或属性时,sealed修饰符必须始终与override一起使用. ...
- abstract、override、new、virtual、sealed使用和示例
abstract修饰类名为抽象类,修饰方法为抽象方法.如果一个类为抽象类,则这个类智能是其他某个类的基类.抽象方法在抽象类中没有函数体.抽象类中的抽象方法是没有方法体的,继承其的子类必须实现抽象类的抽 ...
- virtual abstract override new 几点学习
1.Vitual方法和普通方法区别为:继承其的子类可以用override/new在重载此方法,也可以不重载其方法,有方法体(可以写语句),override修饰则调用子类方法2.abstract类中抽象 ...
- c#中abstract、override、new、virtual、sealed使用
abstract 修饰类名为抽象类,修饰方法为抽象方法.如果一个类为抽象类,则这个类智能是其他某个类的基类.抽象方法在抽象类中没有函数体.抽象类中的抽象方法是没有方法体的,继承其的子类必须实现 ...
- c#中abstract、override、new、virtual、sealed使用和示例
原文地址:http://blog.csdn.net/richerg85/article/details/7407544 abstract 修饰类名为抽象类,修饰方法为抽象方法.如果一个类为抽 ...
- C#--virtual,abstract,override,new,sealed
virtual:使用此关键字,可以使其在派生类中被重写. abstract:抽象方法,由子类重写,或继续为抽象方法存在,并由其子子类实现. override: 重写父类方法,属性,或事件的抽象实现或虚 ...
随机推荐
- android 本地数据库sqlite的封装
单机android sqlite数据库的实现,这个数据库可与程序一起生成在安装包中 一.下载sqlite3.exe文件 二.运行 cmd 转到sqlite3.exe 所在目录 运行 sqlite ...
- (高级篇 Netty多协议开发和应用)第十章-Http协议开发应用(基于Netty的HttpServer和HttpClient的简单实现)
1.HttpServer package nettyHttpTest; import io.netty.bootstrap.ServerBootstrap; import io.netty.chann ...
- javaWeb学习总结(8)- JSP标签(6)
一.JSP标签介绍 JSP标签也称之为Jsp Action(JSP动作)元素,它用于在Jsp页面中提供业务逻辑功能,避免在JSP页面中直接编写java代码,造成jsp页面难以维护. 二.JSP常用标签 ...
- 详解Linux进程(作业)的查看和杀死
目录: 引入进程 进程 线程 PS命令 TOP命令 其他查看进程命令 进程的优先级 作业控制机制 kill命令 一.引入进程 1.内存划分为:用户空间和内核空间 1.在用户空间里运行的进程,就是用户进 ...
- JavaSE(一) IO类层次关系和各种IO流的用法总结
今天把IO流的这一知点进行一下总结,因为在之前使用io流的时候,就只知道几个重点常用的IO类,比如FileInputStream,BufferedInputStream(缓冲流)等等,但是不知道它处于 ...
- golang实现dns域名解析(三):响应报文分析
前面说了构造请求发送报文,接下来我们好好研究下如何解析服务器端发回来的应答信息. 首先还是用前面的程序代码发一个请求,用抓包工具看看应答的内容有哪些: 截图的第一部分是返回信息的统计,表明这个返回的包 ...
- 小K的H5之旅-HTML的基本结构与基本标签
一.什么是HTML HTML是超文本标签语言,即网页的源码.而浏览器就是翻译解释HTML源码的工具. 二.HTML文档的结构 HTML文档主要包括三大部分:文档声明部分.<head>头部部 ...
- [转]tomcat部署
转载博客原文地址: http://www.cnblogs.com/xing901022/p/4463896.html 阅读目录 介绍 静态部署——在tomcat启动时部署 动态部署——在tomcat ...
- CentOS7安装使用Docker
安装 Docker 官方为了简化安装流程,提供了一套安装脚本,CentOS 系统上可以使用这套脚本安装: curl -sSL https://get.docker.com/ | sh 执行这个命令后, ...
- PHP:phpMyAdmin如何解决本地导入文件(数据库)为2M的限制
经验地址:http://jingyan.baidu.com/article/e75057f2a2288eebc91a89b7.html 当我们从别人那里导出数据库在本地导入时,因为数据库文件大于2M而 ...