C#学习基本概念之关键字--abstract与sealed
1.abstract修饰符
abstract
修饰符指示所修饰的内容缺少实现或未完全实现。 abstract 修饰符可用于类、方法、属性、索引器和事件。 在类声明中使用 abstract
修饰符以指示某个类只能是其他类的基类。 标记为抽象或包含在抽象类中的成员必须通过从抽象类派生的类来实现。
在此例中,类 Square
必须提供 Area
的实现,因为它派生自 ShapesClass
:
abstract class ShapesClass{ abstract public int Area();} class Square : ShapesClass{ int side = 0; public Square(int n){side = n;} // Area method is required to avoid// a compile-time error.public override int Area(){ return side * side;} static void Main() {Square sq = new Square(12);Console.WriteLine("Area of the square = {0}", sq.Area());} interface I{ void M();} abstract class C : I{ public abstract void M();}} // Output: Area of the square = 144
抽象类具有以下特性:
抽象类不能实例化。
抽象类可以包含抽象方法和抽象访问器。
不能用 sealed 修饰符修饰抽象类,因为这两个修饰符的含义是相反的。 采用
sealed
修饰符的类无法继承,而abstract
修饰符要求对类进行继承。从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实际实现。
在方法或属性声明中使用 abstract
修饰符以指示方法或属性不包含实现。
抽象方法具有以下特性:
抽象方法是隐式的虚方法。
只允许在抽象类中使用抽象方法声明。
因为抽象方法声明不提供实际的实现,所以没有方法体;方法声明只是以一个分号结束,并且在签名后没有大括号 ({ })。 例如:
public abstract void MyMethod(); 实现由一个重写方法重写提供,此重写方法是非抽象类的一个成员。在抽象方法声明中使用 static 或 virtual 修饰符是错误的。 除了在声明和调用语法上不同外,抽象属性的行为与抽象方法一样。 在静态属性上使用 abstract 修饰符是错误的。 在派生类中,通过包括使用 override 修饰符的属性声明,可以重写抽象的继承属性。 有关抽象类的更多信息,请参见抽象类、密封类及类成员。 抽象类必须为所有接口成员提供实现。 实现接口的抽象类可以将接口方法映射到抽象方法上。 例如:
interface I{ void M();} abstract class C : I{ public abstract void M();}
在本例中,DerivedClass
类是从抽象类 BaseClass
派生的。 抽象类包含一个抽象方法 AbstractMethod
和两个抽象属性 X
和 Y
。
abstract class BaseClass // Abstract class{ protected int _x = 100; protected int _y = 150; public abstract void AbstractMethod(); // Abstract methodpublic abstract int X { get; } public abstract int Y { get; }} class DerivedClass : BaseClass{ public override void AbstractMethod(){_x++;_y++;} public override int X // overriding property{ get{ return _x + 10;}} public override int Y // overriding property{ get{ return _y + 10;}} static void Main(){DerivedClass o = new DerivedClass();o.AbstractMethod();Console.WriteLine("x = {0}, y = {1}", o.X, o.Y);}} // Output: x = 111, y = 161
在上面的示例中,如果尝试通过使用下面的语句将抽象类实例化:
BaseClass bc = new BaseClass(); // Error
将出现错误,指出编译器无法创建抽象类“BaseClass”的实例。
备注:摘自:https://msdn.microsoft.com/zh-cn/library/sf985hc5.aspx
****************************************
2.sealed修饰符
当对一个类应用 sealed
修饰符时,此修饰符会阻止其他类从该类继承。 在下面的示例中,类 B
从类 A
继承,但是任何类都不能从类 B
继承
class A {} sealed class B : A {}
还可以在重写基类中的虚方法或虚属性的方法或属性上使用 sealed
修饰符。 这将使您能够允许类从您的类继承,并防止它们重写特定的虚方法或虚属性。
示例
在下面的示例中,Z
从 Y
继承,但 Z
无法重写在 X
中声明并在 Y
中密封的虚函数 F
。
class X{ protected virtual void F() { Console.WriteLine("X.F"); } protected virtual void F2() { Console.WriteLine("X.F2"); }} class Y : X{ sealed protected override void F() { Console.WriteLine("Y.F"); } protected override void F2() { Console.WriteLine("Y.F2"); }} class Z : Y{ // Attempting to override F causes compiler error CS0239.// protected override void F() { Console.WriteLine("C.F"); }// Overriding F2 is allowed.protected override void F2() { Console.WriteLine("Z.F2"); }}当在类中定义新的方法或属性时,通过不将这些方法或属性声明为 virtual,可防止派生类重写这些方法或属性。 将 abstract 修饰符用于密封类是错误的做法,因为抽象类必须由提供抽象方法或属性的实现的类继承。 当应用于方法或属性时,sealed 修饰符必须始终与 override 一起使用。 由于结构是隐式密封的,因此它们不能被继承。 有关更多信息,请参见 继承。 有关更多示例,请参见抽象类、密封类及类成员。
sealed class SealedClass{ public int x; public int y;} class SealedTest2{ static void Main(){SealedClass sc = new SealedClass();sc.x = 110;sc.y = 150;Console.WriteLine("x = {0}, y = {1}", sc.x, sc.y);}} // Output: x = 110, y = 150
在上一个示例中,您可能尝试使用下面的语句从密封类继承:
class MyDerivedC: SealedClass {} // Error
将产生一条错误消息:
'MyDerivedC' cannot inherit from sealed class 'SealedClass'.
备注:转自https://msdn.microsoft.com/zh-cn/library/88c54tsw.aspx
转载于:https://blog.51cto.com/jiaojusuimu/1876920
C#学习基本概念之关键字--abstract与sealed相关推荐
- C#学习基本概念之关键字---delegate(委托)
委托类型的声明与方法签名相似, 有一个返回值和任意数目任意类型的参数: public delegate void TestDelegate(string message); public deleg ...
- Java学习(静态static关键字,数组工具类Arrays,数学相关工具类(绝对值,向上取整,向下取整),继承,super和this关键字,抽象)
2022/1/2 (1/6)Java学习 1.静态Static关键字概述 一旦用了static关键字,那么这样的内容不再属于对象自己,而是属于类的,所以凡是本类的对象,都共享同一份. 2.静态stat ...
- mfc实现c语言的注释,C语言学习:标识符、关键字、注释、表达式和语句
正文共:1526 字 2 图.预计阅读时间: 4 分钟. 文章由源世界原创,转载剽窃必究! 标识符 界说变量时,我们使用了诸如 a.abc.mn123 这样的名字,它们都是程序员自己起的,一般能够表达 ...
- 关键字abstract
关键字abstract 介绍: 随着继承层次中一个个新子类的定义,类变得越来越具体,而父类则更一般,更通用.类的设计应该保证父类和子类能够共享特征.有时将一个父类设计得非常抽象,以至于它没有具体的实例 ...
- 基于keras的深度学习基本概念讲解
基于keras的深度学习基本概念讲解 Tensorflow1.0正式发布,谷歌首届Tensorflow开发者大会在山景召开,深度学习迎来新的高潮和狂欢.随着深度学习框架的普及和推广,会有越来越多人加入 ...
- NIO学习–核心概念与基本读写
转载自 NIO学习–核心概念与基本读写 这两天花了时间学习了java的nio,看的书是Ron Hitchens著的 <Java NIO>,总的来说,这本书真的写的非常好,而且整本书将jav ...
- java学习中,instanceof 关键字 和 final 关键字、值的传递(java 学习中的小记录)...
java学习中,instanceof 关键字 和 final 关键字.值的传递(java 学习中的小记录)作者:王可利(Star·星星) instanceof 关键字 作用: 1.用来判断某个对象是否 ...
- unity的C#学习——标识符号、关键字与数据类型及其转换方式
文章目录 标识符号 关键字 数据结构 1.值类型(Value types) 2.引用类型(Reference types) 2.1 对象(Object)类型 2.2 动态(Dynamic)类型 2.3 ...
- 强化学习的概念及学习过程
强化学习的概念 强化学习主要由智能体(agent)和环境(environment)两部分组成.智能体代表具有行为能力的物体,环境指智能体执行动作时所处的场景.其目标是寻找一个最优策略,使智能体在运动过 ...
最新文章
- 软件开发代码中各国语言对应的缩写
- Linux服务器rsync自动备份
- SQL Sever 性能调优
- C++ 学习之旅(11)——类和结构中的static
- python原理书籍_python书籍推荐:《深入浅出深度学习:原理剖析与Python实践》
- c语言广播程序,C语言socket编程---udp通信及广播
- 台湾台积电为华为两肋插刀,扛住压力,单日损失1426亿元
- FreeTextBox的使用
- delphi调用https
- OpenCV的二值化处理函数threshold()详解
- 【转载】从创业者角度看《印度合伙人 Padman》后的一点感受
- 「津津乐道播客」#342 编码人声:跟「老」程序员们聊聊编程的历史与未来
- 流媒体与实时计算,Netflix公司Druid应用实践
- rp导入图片大小_Axure制作图像的放大与缩小效果的四种方式
- ShaderJoy —— 用 Shader 绘制一只可爱的 “小挠斧” (详细版)【GLSL】
- 如何在计算机中打开显卡,windows系统如何打开显卡的硬件加速呢?
- JAVA IO与NIO优劣浅析
- ASO优化如何做?这几个技巧你绝对要了解
- Matlab软件绘制图像线颜色(RGB)参数设置
- 服务器系统挂安卓游戏吗,云服务器可以挂游戏吗
热门文章
- java 判断文件是否可读_如何检查文件在Java中是否可读,可写或可执行?
- 【Day34 文献精读】Of magnitudes and metaphors: Explaining cognitive interactions between space, time,and..
- 保时捷叫板特斯拉 这款售价150万的首款电动车能成吗?
- 以太坊源码阅读【环境安装MAC】
- Linux账户标识R=400是什么意思_linux系统安装软件注意事项 @叼毛一个
- Pycharm使用shell命令
- 【小工具】滑动时间窗统计单位时间内访问频率
- EF5.0odeFirst数据迁移找不到Shell10.0
- Redis 安装使用以及原理攻略
- Java面试之synchronized的前世今生