標籤:c#
介面與抽象類別的相同點:
1、不能執行個體化;
2、包含未實現的方法聲明;
3、衍生類別必須實現未實現的方法,抽象類別是抽象方法,介面則是所有成員(不僅是方法包括其他成員);
介面與抽象類別的區別:
類是對對象的抽象,可以把抽象類別理解為把類當作對象,抽象成的類叫做抽象類別.而介面只是一個行為的規範或規定
介面基本上不具備繼承的任何具體特點,它僅僅承諾了能夠調用的方法;
一個類一次可以實現若干個介面,但是只能擴充一個父類
介面可以用於支援回調,而繼承並不具備這個特點.
抽象類別不能被密封。
抽象類別實現的具體方法預設為虛的,但實現介面的類中的介面方法卻預設為非虛的,當然您也可以聲明為虛的.
.(介面)與非抽象類別類似,抽象類別也必須為在該類的基類列表中列出的介面的所有成員提供它自己的實現。但是,允許抽象類別將介面方法映射到抽象方法上。
抽象類別實現了oop中的一個原則,把可變的與不可變的分離。抽象類別和介面就是定義為不可變的,而把可變的座位子類去實現。
好的介面定義應該是具有專一功能性的,而不是多功能的,否則造成介面汙染。如果一個類只是實現了這個介面的中一個功能,而不得不去實現介面中的其他方法,就叫介面汙染。
如果抽象類別實現介面,則可以把介面中方法映射到抽象類別中作為抽象方法而不必實現,而在抽象類別的子類中實現介面中方法.
什麼時候使用抽象類別和介面
1. 如果預計要建立組件的多個版本,則建立抽象類別。抽象類別提供簡單的方法來控制組件版本。
2.如果建立的功能將在大範圍的全異對象間使用,則使用介面。如果要設計小而簡練的功能塊,則使用介面。
3.如果要設計大的功能單元,則使用抽象類別.如果要在組件的所有實現間提供通用的已實現功能,則使用抽象類別。
4.抽象類別主要用於關係密切的對象;而介面適合為不相關的類提供通用功能。介面一旦建立就不能更改。如果需要介面的新版本,必須建立一個全新的介面。
C#介面和抽象類別Animal樣本
下面的執行個體,本樣本沒有闡述抽象類別和介面在設計模式中的應用,因為那將是另一篇有討論價值的文本,本文著眼與概念和原則的把握,但是真正的應用來自於具體的需求規範。
設計結構:
650) this.width=650;" title="22.jpg" style="float:none;" src="http://s3.51cto.com/wyfs02/M02/6C/FC/wKioL1VZmFTSQ62FAAFf19saQVQ150.jpg" alt="wKioL1VZmFTSQ62FAAFf19saQVQ150.jpg" />
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace ConsoleApplication1{ //定義抽象類別 public abstract class Animal{ protected string _name; //聲明抽象屬性 public abstract string Name{ get;} //聲明抽象方法 public abstract void show(); //實現一般方法 public void MakeVoice(){ Console.WriteLine("all animals can make voice!");}} //定義介面 public interface IAction{ void Move();} //實現抽象類別和介面 public class Duck:Animal ,IAction { public Duck(String name){_name =name;} //重載抽象方法 public override void show(){ Console.WriteLine (_name+ " is showing for you.");} //重載抽象屬性 public override string Name{ get { return _name;}} //實現介面 public void Move(){ Console.WriteLine ("Duck also can swim.");}} public class Dog : Animal, IAction{ public Dog(String name){_name = name;} //重載抽象方法 public override void show(){ Console.WriteLine(_name + " is showing for you.");} //重載抽象屬性 public override string Name{ get { return _name; }} //實現介面 public void Move(){ Console.WriteLine(_name +" also can swim.");}} //用戶端實現 public class TestAnimal{ static void Main(){ //聲明抽象類別 Animal duck = new Duck("Duck");duck.MakeVoice();duck.show(); Animal dog = new Dog("Dog");dog.MakeVoice();dog.show(); //聲明介面 IAction dogAction = new Dog("A big dog");dogAction.Move(); Console.ReadLine();}}}
結果:
650) this.width=650;" title="33.PNG" style="float:none;" src="http://s3.51cto.com/wyfs02/M00/6C/FC/wKioL1VZmFPj5W63AABcBiYFNrk152.jpg" alt="wKioL1VZmFPj5W63AABcBiYFNrk152.jpg" />
參考:
http://blog.csdn.net/lwk2011/article/details/5974383
http://www.cnblogs.com/mytechblog/articles/1906940.html
http://blog.csdn.net/cjr15233661143/article/details/8592527
本文出自 “Ricky's Blog” 部落格,請務必保留此出處http://57388.blog.51cto.com/47388/1652420
22. C# -- 抽象類別和介面