C# 接口

2018-01-16 04:19 更新

C#接口

接口提供了一個規(guī)范而不是其成員的實現(xiàn)。

接口作為定義和實現(xiàn)之間的聯(lián)系。

接口成員都是隱式抽象的。

類或結構可以實現(xiàn)多個接口。

接口聲明就像一個類聲明,但它不為其成員提供實現(xiàn)。

這些成員將由實現(xiàn)接口的類和結構實現(xiàn)。

接口只能包含方法,屬性,事件和索引器。

例子

下面是在System.Collections中定義的IEnumerator接口的定義:

public interface IEnumerator { 
    bool MoveNext(); 
    object Current { get; } 
    void Reset(); 
} 

接口成員總是隱式公開的,不能聲明訪問修飾符。

實現(xiàn)接口意味著為其所有成員提供公共實現(xiàn):

class Countdown : IEnumerator { 
    int count = 11; 
    public bool MoveNext () { 
       return count-- > 0 ; 
    } 
    public object Current { 
       get { 
          return count; 
       } 
    } 
    public void Reset() { 
       throw new NotSupportedException(); 
    } 
} 

您可以將對象隱式轉換為它實現(xiàn)的任何接口。例如:

IEnumerator e = new Countdown(); 
while (e.MoveNext()) 
Console.Write (e.Current);

擴展接口

接口可以從其他接口派生。

例如:

public interface IUndoable { 
   void Undo(); 
} 

public interface IRedoable : IUndoable { 
   void Redo(); 
} 

IRedoable “繼承" IUndoable 的所有成員。

顯式接口實現(xiàn)

實現(xiàn)多個接口有時可能導致成員方法之間的沖突。

我們可以通過顯式實現(xiàn)一個接口成員來解決這種沖突。

考慮下面的例子:

interface Interface1 { 
   void iMethod(); 
} 
interface Interface2 { 
   int iMethod(); 
} 

public class Widget : Interface1, Interface2 { 
   public void iMethod () {
        Console.WriteLine ("Widget"s implementation of Interface1.iMethod"); 
   }
   int Interface2.iMethod(){ 
       Console.WriteLine ("Widget"s implementation of Interface2.iMethod"); 
       return 42;
   } 
} 

這使得兩種方法在一個類中共存。調用顯式實現(xiàn)的成員的唯一方法是轉換到其接口:

Widget w = new Widget(); 
w.iMethod(); // Widget"s implementation of Interface1.iMethod 
((Interface1)w).iMethod(); // Widget"s implementation of Interface1.iMethod 
((Interface2)w).iMethod(); // Widget"s implementation of Interface2.iMethod 

實質上實現(xiàn)接口成員

隱式實現(xiàn)的接口成員默認是封裝的。

它必須在基類中標記為virtualor或abstract以便被覆蓋。

例如:

public interface IUndoable { 
   void Undo(); 
} 

public class DrawPad : IUndoable { 
    public virtual void Undo() {
        Console.WriteLine ("DrawPad.Undo"); 
    } 
} 

public class RichDrawPad : DrawPad { 
    public override void Undo() {
        Console.WriteLine ("RichDrawPad.Undo"); 
    } 
} 
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號