自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

C#接口和抽象類(lèi)的經(jīng)典示例與比對(duì)

開(kāi)發(fā) 后端
學(xué)習(xí)C#接口和抽象類(lèi)最好的方法莫過(guò)于研究范例。.NET框架是最好的學(xué)習(xí)資源,另外本文也提供了幾個(gè)實(shí)例。

C#接口和抽象類(lèi)絕對(duì)經(jīng)典示例

.NET Framework是學(xué)習(xí)的最好資源,有意識(shí)的研究FCL是每個(gè).NET程序員的必修課,關(guān)于接口和抽象類(lèi)在FCL中的使用,我有以下的建議:

FCL對(duì)集合類(lèi)使用了基于接口的設(shè)計(jì),所以請(qǐng)關(guān)注System.Collections中關(guān)于接口的設(shè)計(jì)實(shí)現(xiàn);

FCL對(duì)數(shù)據(jù)流相關(guān)類(lèi)使用了基于抽象類(lèi)的設(shè)計(jì),所以請(qǐng)關(guān)注System.IO.Stream類(lèi)的抽象類(lèi)設(shè)計(jì)機(jī)制。

C#接口和抽象類(lèi)Animal示例

下面的實(shí)例,因?yàn)槭俏业睦斫?,因此給經(jīng)典打上“相對(duì)”的記號(hào),至于什么時(shí)候晉升為“絕對(duì)”,就看我在.NET追求的路上,是否能夠一如既往的如此執(zhí)著,因此我將把相對(duì)重構(gòu)到絕對(duì)為止(呵呵)。 本示例沒(méi)有闡述抽象類(lèi)和接口在設(shè)計(jì)模式中的應(yīng)用,因?yàn)槟菍⑹橇硪黄杏懻搩r(jià)值的文本,本文著眼與概念和原則的把握,但是真正的應(yīng)用來(lái)自于具體的需求規(guī)范。

設(shè)計(jì)結(jié)構(gòu)如圖所示:

設(shè)計(jì)結(jié)構(gòu)圖

1. 定義抽象類(lèi)

  1. public abstract class Animal   
  2. {   
  3. protected string _name;   
  4. //聲明抽象屬性   
  5. public abstract string Name   
  6. {   
  7. get;   
  8. }   
  9.  
  10. //聲明抽象方法   
  11.  
  12. public abstract void Show();   
  13.  
  14. //實(shí)現(xiàn)一般方法   
  15.  
  16. public void MakeVoice()   
  17. {   
  18. Console.WriteLine("All animals can make voice!");   
  19. }   
  20. }   
  21.  
  22.    

2. 定義接口

  1. public interface IAction   
  2. {   
  3. //定義公共方法標(biāo)簽   
  4. void Move();   
  5. }  

3. 實(shí)現(xiàn)抽象類(lèi)和接口

  1. public class Duck : Animal, IAction   
  2. {   
  3. public Duck(string name)   
  4. {   
  5. _name = name;   
  6. }   
  7. //重載抽象方法   
  8.  
  9. public override void Show()   
  10. {   
  11. Console.WriteLine(_name + " is showing for you.");   
  12. }   
  13.  
  14. //重載抽象屬性   
  15.  
  16. public override string Name   
  17. {   
  18. get { return _name;}   
  19. }   
  20.  
  21. //實(shí)現(xiàn)接口方法   
  22.  
  23. public void Move()   
  24. {   
  25. Console.WriteLine("Duck also can swim.");   
  26. }   
  27. }   
  28.  
  29. public class Dog : Animal, IAction   
  30. {   
  31. public Dog(string name)   
  32. {   
  33. _name = name;   
  34. }   
  35. public override void Show()   
  36. {   
  37. Console.WriteLine(_name + " is showing for you.");   
  38. }   
  39.  
  40. public override string Name   
  41. {   
  42. get { return _name; }   
  43.  
  44. }   
  45.  
  46. public void Move()   
  47. {   
  48. Console.WriteLine(_name + " also can run.");   
  49. }   
  50. }   
  51.  

4. 客戶(hù)端實(shí)現(xiàn)

  1. public class TestAnmial   
  2. {   
  3. public static void Main(string [] args)   
  4. {   
  5. Animal duck = new Duck("Duck");   
  6. duck.MakeVoice();   
  7. duck.Show();   
  8. Animal dog = new Dog("Dog");   
  9. dog.MakeVoice();   
  10. dog.Show();   
  11. IAction dogAction = new Dog("A big dog");   
  12. dogAction.Move();   
  13. }   
  14. }   

dunai認(rèn)為:抽象類(lèi)是提取具體類(lèi)的公因式,而接口是為了將一些不相關(guān)的類(lèi)“雜湊”成一個(gè)共同的群體。至于他們?cè)诟鱾€(gè)語(yǔ)言中的句法,語(yǔ)言細(xì)節(jié)并不是我關(guān)心的重點(diǎn)。

Artech認(rèn)為:所代碼共用和可擴(kuò)展性考慮,盡量使用Abstract Class。當(dāng)然接口在其他方面的優(yōu)勢(shì),我認(rèn)為也不可忽視。

shenfx認(rèn)為:當(dāng)在差異較大的對(duì)象間尋求功能上的共性時(shí),使用接口;當(dāng)在共性較多的對(duì)象間尋求功能上的差異時(shí),使用抽象基類(lèi)。

最后,有關(guān)C#接口和抽象類(lèi)的學(xué)習(xí),MSDN的建議:

如果預(yù)計(jì)要?jiǎng)?chuàng)建組件的多個(gè)版本,則創(chuàng)建抽象類(lèi)。抽象類(lèi)提供簡(jiǎn)單易行的方法來(lái)控制組件版本。通過(guò)更新基類(lèi),所有繼承類(lèi)都隨更改自動(dòng)更新。另一方面,接口一旦創(chuàng)建就不能更改。如果需要接口的新版本,必須創(chuàng)建一個(gè)全新的接口。

如果創(chuàng)建的功能將在大范圍的全異對(duì)象間使用,則使用接口。抽象類(lèi)應(yīng)主要用于關(guān)系密切的對(duì)象,而接口最適合為不相關(guān)的類(lèi)提供通用功能。

如果要設(shè)計(jì)小而簡(jiǎn)練的功能塊,則使用接口。如果要設(shè)計(jì)大的功能單元,則使用抽象類(lèi)。

如果要在組件的所有實(shí)現(xiàn)間提供通用的已實(shí)現(xiàn)功能,則使用抽象類(lèi)。抽象類(lèi)允許部分實(shí)現(xiàn)類(lèi),而接口不包含任何成員的實(shí)現(xiàn)。

【編輯推薦】

  1. 什么是.NET接口?什么是.NET抽象類(lèi)?
  2. C#接口定義學(xué)習(xí)經(jīng)驗(yàn)
  3. 概述C# COM接口相關(guān)知識(shí)
  4. 淺談C#抽象類(lèi)和C#接口
  5. C# ICloneable接口應(yīng)用淺析
責(zé)任編輯:yangsai 來(lái)源: 網(wǎng)絡(luò)轉(zhuǎn)載
相關(guān)推薦

2009-08-10 10:04:25

C#抽象類(lèi)C#接口

2009-07-30 18:36:00

C#接口C#抽象類(lèi)

2011-07-06 10:33:31

C#

2011-07-12 15:58:48

java抽象類(lèi)接口

2009-08-03 18:12:31

C#抽象類(lèi)

2009-09-04 13:31:33

C#抽象類(lèi)

2012-02-29 09:32:01

Java

2011-06-28 10:55:20

C#接口抽象類(lèi)

2009-04-30 15:15:01

Java抽象類(lèi)接口

2010-03-04 09:40:04

Java接口抽象類(lèi)

2011-05-19 18:01:56

JAVA

2011-07-10 14:07:59

JAVA

2009-06-16 11:30:00

Java抽象類(lèi)Java接口

2009-06-14 21:31:29

Java抽象類(lèi)Java接口

2011-12-22 10:48:21

Java

2015-03-23 09:33:43

Java抽象類(lèi)Java接口Java

2021-12-23 07:11:31

開(kāi)發(fā)

2009-11-23 20:00:25

PHP5接口PHP5抽象類(lèi)

2020-10-19 13:03:16

Java 8接口抽象類(lèi)

2020-02-07 10:55:37

抽象類(lèi)接口秒懂
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)