abstract 修饰符指示所修饰的内容缺少实现或未完全实现,可用于类、方法、属性、索引器和事件。一般没有加abstract修饰的即默认为virtual。
一、abstract修饰的类叫抽象类。抽象类中的内容因缺少实现或未完全实现,因此不能生成对象实例,只能用于其他类的基类或做为对象变量声明的类型,且抽象类中的成员则必须通过由该抽象类派生的类来实现,即通过子类继承并覆盖抽象类中的抽象方法。
如下:类Square必须提供Area的实现,因为它派生自ShapesClass

abstract class ShapesClass
{abstract public int Area();
}
class Square : ShapesClass
{int x, y;public override int Area(){return x * y;}
}

抽象类的特性:
1、抽象类不能实例化。
2、抽象类可以包含抽象方法和抽象访问器。
3、不能用 sealed(C# 参考)修饰符修改抽象类,这意味着抽象类不能被继承。
4、从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实实现。

二、abstract修饰的方法即抽象方法。

抽象方法的特性:
1、抽象方法是隐式的虚方法。
2、只允许在抽象类中使用抽象方法声明。
3、因为抽象方法声明不提供实际的实现,所以没有方法体;方法声明只是以一个分号结束,并且在签名后没有大括号 ({ })。例如:

public abstract void MyMethod();  

4、实现由一个重写方法提供,此重写方法是非抽象类的成员。
5、在抽象方法声明中使用 static 或 virtual 修饰符是错误的。

三、abstract修饰的属性即抽象属性。
抽象属性的特性:
1、在静态属性上使用 abstract 修饰符是错误的。
2、在派生类中,通过包括使用 override 修饰符的属性声明,可以重写抽象的继承属性。

四、补充:抽象类必须为所有接口成员提供实现。实现接口的抽象类可以将接口方法映射到抽象方法上。例如:

interface I
{void M();
}
abstract class C: I
{public abstract void M();
}

在下面示例中,DerivedClass 类是从抽象类 BaseClass 派生的。抽象类包含一个抽象方法 AbstractMethod 和两个抽象属性 X 和 Y。

// abstract_keyword.cs
// Abstract Classes
using System;
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);}
}

输出:x = 111, y = 161

在上面的示例中,如果试图通过使用下面的语句将抽象类实例化:

BaseClass bc = new BaseClass();   // Error

将出现错误,指出编译器无法创建抽象类“BaseClass”的实例。

C#关键字之abstract详解相关推荐

  1. java中strictfp关键字,java strictfp关键字用法大全详解

    一.strictfp关键字简介 strictfp是Java中提供的一个保留关键字,该关键字是从这第java JDK2版本儿开始出现的一直沿用到现在,只不过很多情况下都不怎么使用,所以容易被大家遗忘,因 ...

  2. escape mysql_MySQL中ESCAPE关键字的用法详解

    MySQL转义 转义即表示转义字符原来的语义,一个转义字符的目的是开始一个字符序列,使得转义字符开头的该字符序列具有不同于该字符序列单独出现时的语义. MySQL中,转义字符以"" ...

  3. python之33个关键字详解_Python解析、提取url关键字的实例详解

    解析url用的类库: python2版本: from urlparse import urlparse import urllib python3版本: from urllib.parse impor ...

  4. php中this的使用技巧,JavaScript中this关键字使用方法详解

    JavaScript中this关键字使用方法详解 在面向对象编程语言中,对于this关键字我们是非常熟悉的.比如C++.C#和Java等都提供了这个关键字,虽然在开始学习的时候觉得比较难,但只要理解了 ...

  5. MySQL中ESCAPE关键字的用法详解

    MySQL中ESCAPE关键字的用法详解 MySQL中ESCAPE关键字的用法详解 1. mysql转义概述 2. escape验证 MySQL中ESCAPE关键字的用法详解 1. mysql转义概述 ...

  6. Python实用技巧:global关键字的用法详解

    这篇文章主要介绍了python global关键字的用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下: 想要更好的了解global关键字,首先 ...

  7. mysql escape关键字_MySQL中ESCAPE关键字的用法详解

    MySQL转义 转义即表示转义字符原来的语义,一个转义字符的目的是开始一个字符序列,使得转义字符开头的该字符序列具有不同于该字符序列单独出现时的语义. MySQL中,转义字符以"\" ...

  8. C#关键字之Partial详解

    Partial是局部类型的标志.局部类型可以实现将一个类.结构或接口分成几个部分,分别放在在几个不同的.cs文件中(当然也可以放在同一个.cs文件中).在程序进行编译之后,将会合并成一个完整的类.因此 ...

  9. [Python] 关键字 yield 用法详解

    一个十分十分优秀的博客: python中yield的用法详解--最简单,最清晰的解释.

最新文章

  1. oracle 优化逻辑读过高,详述逻辑读与arraysize的关系
  2. 三.Hystrix资源隔离
  3. 【数字智能三篇】之三: 一页纸说清楚“什么是深度学习?”
  4. 鸿蒙是单线程还是多线程,鸿蒙 RT-Thread 两者之间究竟是不是竞争关系呢
  5. Ionic 用于构建惊人的移动应用程序的顶级开源框架
  6. 业界资讯:adobe air 2.7 beta发布
  7. uint8_t / uint16_t / uint32_t /uint64_t  有什么区别?
  8. Java实现视频网站的视频上传、视频转码、视频关键帧抽图, 及视频播放功能
  9. c语言case label,an enum switch case label must be the unqualified name of an enumeration constant
  10. Mac 识别NTFS移动硬盘
  11. read一个收到RST的socket会返回0?
  12. 安装nuxt_一天上手Nuxt基于vue服务端渲染
  13. abb变频器580系列改中文_ABB变频器ACS580系列
  14. 史上最全java自动化测试工具汇总
  15. SECRET文件保险柜 V2.7 --统一管理并加密文件
  16. java工程师职责负责_java工程师岗位职责
  17. 分块矩阵的逆矩阵的公式记忆方法
  18. 《谈美》读书感想:读书于人生的意义
  19. linux下登录不上oracle,Oracle特定用户登录失败案例 ORA-20001
  20. O2O商城网站建设方案

热门文章

  1. html中的target属性解析
  2. js ES6 fetch 方法
  3. Android Button 属性介绍与使用
  4. 李嘉诚为何永远在赚钱?他有4招独门“财技”
  5. 规范你的Android应用通知渠道
  6. 2006世界杯球员名单全部出炉 32支球队
  7. 基于VUE的ElementUi可视化表单设计器布局器
  8. 米鼠老爹创业之路米粉招募
  9. 谷歌版 ChatGPT 首秀就翻车...
  10. 由ip计算子网掩码和默认网关