1. 程式人生 > >C# 抽象類和抽象方法

C# 抽象類和抽象方法

tail 出現 keyword bstr pos term string enter net

首先,在學習抽象方法的時候,我們必須清楚在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();

註意:

只有抽象類可以有抽象方法,不過抽象類可以有具體方法。如果把一個抽象方法放在一個類中,就必須標識這個類為抽象類。

實例代碼如下:

[csharp] view plain copy
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace testOverride
  7. {
  8. class Program
  9. {
  10. static void Main(string[] args)
  11. {
  12. Test test = new Test();
  13. test.test();
  14. test.test_1();
  15. test.test_2();//父類中有,子類中沒有的方法,子類依然可以用
  16. Console.ReadKey();
  17. }
  18. }
  19. abstract class method_abstract
  20. {
  21. abstract public void test();
  22. virtual public void test_1() {
  23. Console.WriteLine("This is the test 2.");
  24. }
  25. public void test_2() {
  26. Console.WriteLine("This is the test 3.");
  27. }
  28. }
  29. interface Interface
  30. {
  31. //接口中的方法和屬性都是public,因此不必輸入public
  32. void test();
  33. string test_String { get; set; }//這是接口中的屬性
  34. }
  35. class Test:method_abstract,Interface//抽象類當然可以當做父類了,除了上述區別之外,抽象類和一般類沒有任何區別
  36. {
  37. public override void test()//實現了抽象類的抽象方法
  38. {
  39. Console.WriteLine("this is the test 1.");
  40. }
  41. override public void test_1() {//實現了父類中的虛擬方法
  42. Console.WriteLine("this is the test 1.");
  43. }
  44. public string test_String { get; set; }//如果在子類中不實現接口中全部屬性,代碼將會報錯。
  45. }
  46. }

代碼運行結果如下所示:

技術分享圖片

抽象類和抽象方法講解到此結束!

C# 抽象類和抽象方法