C#之抽象方法

你为什么会选择写一个抽象类呢?当然是为了想某个方法能够被 OVERRIDE,以实现多态。后来查找 MSDN 结果如下:abstract 修饰符可以和类、方法、属性、索引器及事件一起使用。在类声明中使用 abstract 修饰符以指示类只能是其他类的基类。

 

【抽象类】具有以下特性:
  • 抽象类不能实例化。

  • 抽象类可以包含抽象方法和抽象访问器。

  • 不能用 sealed 修饰符修改抽象类,这意味着该类不能被继承。

  • 从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实实现。

在方法或属性声明中使用 abstract 修饰符以指示此方法或属性不包含实现。

 

【抽象方法】具有以下特性:
  • 抽象方法是隐式的 virtual 方法。

  • 只允许在抽象类中使用抽象方法声明。

  • 因为抽象方法声明不提供实实现,所以没有方法体;方法声明只是以一个分号结束,

 

并且在签名后没有大括号 ({ })。例如:
  • public abstract void MyMethod(); 

  • 实现由 overriding 方法提供,它是非抽象类的成员。

  • 在抽象方法声明中使用 static 或 virtual 修饰符是错误的。

 

除了在声明和调用语法上不同外,抽象属性的行为与抽象方法一样。
  • 在静态属性上使用 abstract 修饰符是错误的。

  • 在派生类中,通过包括使用 override 修饰符的属性声明可以重写抽象的继承属性。

抽象类必须为所有接口成员提供实现。

 

MSDN中C#语言规范的:10.1.1.1 抽象类。此文如下: 

abstract 修饰符用于表示所修饰的类是不完整的,并且它只能用作基类。抽象类与非抽象类在以下方面是不同的:

  • 抽象类不能直接实例化,并且对抽象类使用 new 运算符是编译时错误。虽然一些变量和值在编译时的类型可以是抽象的,但是这样的变量和值必须或者为 null,或者含有对非抽象类的实例的引用(此非抽象类是从抽象类派生的)。

  • 允许(但不要求)抽象类包含抽象成员。

  • 抽象类不能被密封。

当从抽象类派生非抽象类时,这些非抽象类必须具体实现所继承的所有抽象成员,从而重写那些抽象成员。在下面的示例中

abstract class A 
{ 
 public abstract void F(); 
} 
abstract class B: A 
{ 
 public void G() {} 
} 
class C: B 
{ 
 public override void F() { 
 // actual implementation of F 
 } 
}

抽象类 A 引入抽象方法 F。类 B 引入另一个方法 G,但由于它不提供 F 的实现,B 也必须声明为抽象类。类 C 重写 F,并提供一个具体实现。由于 C 中没有了抽象成员,因此可以(但并非必须)将 C 声明为非抽象类。

 

有关抽象类和抽象方法的问题,我个人也做了一些总结,如下: abstract 关键字用于将类指定为抽象类,这些抽象类可以派生出其他类。

  • 一个抽象类可以同时包含抽象方法和非抽象方法。

  • 抽象方法的目的在于指定派生类必须实现与这一方法关联的行为。

  • 抽象方法只在派生类中真正实现,这表明抽象方法只存放函数原型(方法的返回类型,使用的名称及参数),而不涉及主体代码。

  • 如果父类被声明为抽象类,并存在未实现的抽象方法,那么子类就必须实现父类中所有的 abstract 成员,除非该类也是抽象的。

  • 抽象类不能被实例化,使用 override 关键字可在派生类中实现抽象方法,经 override

声明重写的方法,其签名必须与 override 方法的签名一致。

 

例如: 

abstract class A 
{ 
   public abstract void F(); 
} 
abstract class BA 
{ 
   public void G() 
   {} 
} 
class CB 
{ 
   public override void F() 
   { 
   // actual implementation of F 
   } 
}

说明:抽象类 A 引入抽象方法 F。类 B 引入另一个方法 G,但由于它不提供 F 的

实现,B 也必须声明为抽象类。类 C 重写 F,并提供一个具体实现。由于 C 中没有了抽象成员,因此可以(但并非必须)将 C 声明为非抽象类。

posted @   懒树懒  阅读(209)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示