C# 抽象类和抽象方法详解

首先,在学习抽象方法的时候,我们必须清楚在C#中为什么会存在抽象方法,或者说为什么需要抽象方法。

 

我们知道,接口可以包含方法的申明和属性,但是方法中不包含代码,实现这个接口的方法必须包含接口中的所有方法和属性,但是现在出现这种情况,假设需要一个“接口”,要求类实现某些方法和属性,但是需要这这个“接口”中包含一些代码,从而不必在每个派生类中重复地实现某些方法,对于这种情况,你需要的不是接口,而是一个抽象类(abstract class)。

 

按照定义,抽象类和一般的类有异同,和接口也有异同。下面笔者将一一为您揭晓。

一、抽象类和一般类的相同点:都可以继承其他的类或者接口,也可以派生子类,并且都有具体的方法;

不同点:抽象类中有抽象方法,一般类中没有;抽象类不可以实例化,一般类却可以;

二、抽象类和接口的相同点:都不能实例化,继承抽象类的子类必须实现抽象类中的抽象方法,实现接口的子类必须实现接口中的全部方法和属性。

不同点:抽象类中除了具有抽象方法之外,还有具体的方法。

抽象类与一般类、接口在代码表示上有所不同:

1、抽象类:abstract class class_abstract_name;

2、一般类:class class_name;

3、接口:interface interface_name;

4、抽象方法:abstract public void test();或者public abstract void test();//抽象方法中必须使用public修饰符

5、一般方法:public/private/protected/.. void/string/int/... method_name();

6、父类中的虚拟方法:public virtual void test_1();或者virtual public void test_1();//虚拟方法必须使用public修饰符。

7、子类中实现父类的虚拟方法或抽象方法:public override void test_1();或者override public void test_1();

注意:

只有抽象类可以有抽象方法,不过抽象类可以有具体方法。如果把一个抽象方法放在一个类中,就必须标识这个类为抽象类。

实例代码如下:

 

 
  1. using System;

  2. using System.Collections.Generic;

  3. using System.Linq;

  4. using System.Text;

  5. using System.Threading.Tasks;

  6.  
  7. namespace testOverride

  8. {

  9. class Program

  10. {

  11. static void Main(string[] args)

  12. {

  13. Test test = new Test();

  14. test.test();

  15. test.test_1();

  16. test.test_2();//父类中有,子类中没有的方法,子类依然可以用

  17. Console.ReadKey();

  18. }

  19. }

  20. abstract class method_abstract

  21. {

  22. abstract public void test();

  23. virtual public void test_1() {

  24. Console.WriteLine("This is the test 2.");

  25. }

  26. public void test_2() {

  27. Console.WriteLine("This is the test 3.");

  28. }

  29. }

  30. interface Interface

  31. {

  32. //接口中的方法和属性都是public,因此不必输入public

  33. void test();

  34. string test_String { get; set; }//这是接口中的属性

  35. }

  36. class Test:method_abstract,Interface//抽象类当然可以当做父类了,除了上述区别之外,抽象类和一般类没有任何区别

  37. {

  38. public override void test()//实现了抽象类的抽象方法

  39. {

  40. Console.WriteLine("this is the test 1.");

  41. }

  42. override public void test_1() {//实现了父类中的虚拟方法

  43. Console.WriteLine("this is the test 1.");

  44. }

  45. public string test_String { get; set; }//如果在子类中不实现接口中全部属性,代码将会报错。

  46. }

  47. }

代码运行结果如下所示:

 

抽象类和抽象方法讲解到此结束!

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值