C#中abstract的用法详解

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C#中abstract的⽤法详解
abstract可以⽤来修饰类,⽅法,属性,索引器和时间,这⾥不包括字段. 使⽤abstrac修饰的类,该类只能作为其他类的基类,不能实例化,⽽且abstract修饰的成员在派⽣类中必须全部实现,不允许部分实现,否则编译异常. 如:
using System;
namespace ConsoleApplication8
{
class Program
{
static void Main(string[] args)
{
BClass b = new BClass();
b.m1();
}
}
abstract class AClass
{
public abstract void m1();
public abstract void m2();
}
class BClass : AClass
{
public override void m1()
{
throw new NotImplementedException();
}
//public override void m2()
//{
// throw new NotImplementedException();
//}
}
}
Abstract classes have the following features:
抽象类拥有如下特征:
1,抽象类不能被实例化, 但可以有实例构造函数, 类是否可以实例化取决于是否拥有实例化的权限 (对于抽象类的权限是abstract, 禁⽌实例化),
即使不提供构造函数, 编译器也会提供默认构造函数;
2,抽象类可以包含抽象⽅法和访问器;
3,抽象类不能使⽤sealed修饰, sealed意为不能被继承;
4,所有继承⾃抽象类的⾮抽象类必须实现所有的抽象成员,包括⽅法,属性,索引器,事件;
abstract修饰的⽅法有如下特征:
1,抽象⽅法即是虚拟⽅法(隐含);
2,抽象⽅法只能在抽象类中声明;
3,因为抽象⽅法只是声明, 不提供实现, 所以⽅法只以分号结束,没有⽅法体,即没有花括号部分;如
public abstract void MyMethod();
4,override修饰的覆盖⽅法提供实现,且只能作为⾮抽象类的成员;
5,在抽象⽅法的声明上不能使⽤virtual或者是static修饰.即不能是静态的,⼜因为abstract已经是虚拟的,⽆需再⽤virtual强调.
抽象属性尽管在⾏为上与抽象⽅法相似,但仍有有如下不同:
1,不能在静态属性上应⽤abstract修饰符;
2,抽象属性在⾮抽象的派⽣类中覆盖重写,使⽤override修饰符;
抽象类与接⼝:
1,抽象类必须提供所有接⼝成员的实现;
2,继承接⼝的抽象类可以将接⼝的成员映射位抽象⽅法.
如:
interface I
{
void M();
}
abstract class C: I
{
public abstract void M();
}
抽象类实例:
// abstract_keyword.cs
// 抽象类
using System;
abstract class BaseClass // 抽象类
{
protected int _x = 100; //抽象类可以定义字段,但不可以是抽象字段,也没有这⼀说法.
protected int _y = 150;
public BaseClass(int i) //可以定义实例构造函数,仅供派⽣的⾮抽象类调⽤; 这⾥显式提供构造函数,编译器将不再提供默认构造函数. {
fielda = i;
}
public BaseClass()
{
}
private int fielda;
public static int fieldsa = 0;
public abstract void AbstractMethod(); // 抽象⽅法
public abstract int X { get; } //抽象属性
public abstract int Y { get; }
public abstract string IdxString { get; set; } //抽象属性
public abstract char this[int i] { get; } //抽象索引器
}
class DerivedClass : BaseClass
{
private string idxstring;
private int fieldb;
//如果基类中没有定义⽆参构造函数,但存在有参数的构造函数,
//那么这⾥派⽣类得构造函数必须调⽤基类的有参数构造函数,否则编译出错
public DerivedClass(int p)
: base(p) //这⾥的:base(p)可省略,因为基类定义了默认的⽆参构造函数
{
fieldb = p;
}
public override string IdxString //覆盖重新属性
{
get
{
return idxstring;
}
set
{
idxstring = value;
}
}
public override char this[int i] //覆盖重写索引器
{
get { return IdxString[i]; }
}
public override void AbstractMethod()
{
_x++;
_y++;
}
public override int X // 覆盖重写属性
{
get
{
return _x + 10;
}
}
public override int Y // 覆盖重写属性
{
get
{
return _y + 10;
}
}
static void Main()
{
DerivedClass o = new DerivedClass(1);
o.AbstractMethod();
Console.WriteLine("x = {0}, y = {1}", o.X, o.Y);
}
}
以上所述是⼩编给⼤家介绍的C#中abstract的⽤法详解,希望对⼤家有所帮助,如果⼤家有任何疑问请给我留⾔,⼩编会及时回复⼤家的。

在此也⾮常感谢⼤家对⽹站的⽀持!。

相关文档
最新文档