分享

C# 抽象类(abstract)

 吴敬锐 2022-12-04 发布于广东

C#抽象类

C#抽象类是特殊的类,只是不能被实例化;除此以外,具有类的其他特性;重要的是抽象类可以包括抽象方法,这是普通类所不能的。抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们。另外,抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如果不覆盖,则其派生类必须覆盖它们。

abstract 修饰符指示被修改内容的实现已丢失或不完整。 abstract 修饰符可用于类、方法、属性、索引和事件。 在类声明中使用 abstract 修饰符来指示某个类仅用作其他类的基类,而不用于自行进行实例化。 标记为抽象的成员必须由派生自抽象类的非抽象类来实现。




抽象方法

用abstract修饰的方法,称为抽象方法。

访问修饰符  abstract  方法返回值类型  方法名(参数列表);

例如:

public abstract void Practice(); 

 抽象方法是一种特殊的虚方法,它只起声明作用,所以只加一个“;”号,一定不能带实现部分。

需要注意的是,抽象方法必须定义在抽象类中。




抽象类:

定义抽象类时,若使用 abstract 修饰类,将其放到 class 关键字的前面,语法形式如下:

访问修饰符  abstract class  类名
{
    //类成员
}

其中“abstract”关键字也可以放到访问修饰符的前面。

在抽象类中可以定义抽象方法,也可以定义非抽象方法。

通常抽象类会被其他类继承,并重写其中的抽象方法或者虚方法。

抽象类具有以下功能: 

  • 抽象类不能实例化。

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

  • 无法使用 sealed 修饰符来修改抽象类,因为两个修饰符的含义相反。 sealed 修饰符阻止类被继承,而 abstract 修饰符要求类被继承。

  • 派生自抽象类的非抽象类,必须包含全部已继承的抽象方法和访问器的实际实现。

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

抽象方法具有以下功能:

  • 抽象方法是隐式的虚拟方法。

  • 只有抽象类中才允许抽象方法声明。

  • 由于抽象方法声明不提供实际的实现,因此没有方法主体;方法声明仅以分号结尾,且签名后没有大括号 ({ })。例如:

 public abstract void MyMethod();

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

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

除了声明和调用语法方面不同外,抽象属性的行为与抽象方法相似。

  • 在静态属性上使用 abstract 修饰符是错误的。

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

用简单的话来说抽象类的功能就是:我是师傅(抽象类),你要是跟了(继承)师傅,你就必须得会干什么(实际实现)

例如:老子会打人,那你也必须会打人,但你是轻轻的打,还是狠狠的打,你自己决定,但你必须得会打人。

实例:

类 DerivedClass 派生自抽象类 BaseClass。 抽象类包含抽象方法 AbstractMethod,以及两个抽象属性 X 和 Y

  1. abstract class BaseClass // Abstract class
  2. {
  3. protected int _x = 100;
  4. protected int _y = 150;
  5. public abstract void AbstractMethod(); // Abstract method
  6. public abstract int X { get; }
  7. public abstract int Y { get; }
  8. }
  9. class DerivedClass : BaseClass
  10. {
  11. public override void AbstractMethod()
  12. {
  13. _x++;
  14. _y++;
  15. }
  16. public override int X // overriding property
  17. {
  18. get
  19. {
  20. return _x + 10;
  21. }
  22. }
  23. public override int Y // overriding property
  24. {
  25. get
  26. {
  27. return _y + 10;
  28. }
  29. }
  30. static void Main()
  31. {
  32. var o = new DerivedClass();
  33. o.AbstractMethod();
  34. Console.WriteLine($'x = {o.X}, y = {o.Y}');
  35. }
  36. }
  37. // Output: x = 111, y = 161

总结:

1,抽象类说明:

①.抽象类中如果有抽象方法,那么被继承的具体类一定要实现抽象类中得所有抽象方法。
②.当然,如果是抽象类B继承抽象类A,那么抽象类B可以实现基类A中的抽象方法,可以不实现A中得抽象方法

2,类(抽象类)的多态

abstract class A
{
public abstract void AFunction ();
}
abstract class B : A
{
public abstract void BFunction ();
}

class C : B
{
public override void AFunction()
  {
    Console.WriteLine ('AFucntion.');
  }
public override void BFunction()
  {
    Console.WriteLine ('BFunction.');
  }

3,总结:

1.抽象方法只作声明,而不包含实现,抽象方法旨在继承后实现,所以不能用private修饰。
2.抽象类不能被直接实例化。
3. 抽象类可以没有抽象属性和抽象方法,但是一旦有了抽象方法,就一定要把这个类声明为抽象类。
4.如果抽象类的派生类不是抽象类,那么必须重写抽象类的所有抽象方法。 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多