2017-02-28 55 views
1

定義方法我已經閱讀msdn是:C#:接口

接口包含沒有實現的方法。

但是,如果我的代碼:

public interface ITest 
{ 
    void Print(string message); 
} 

public static void FullPrint(this ITest test, string message) 
{ 
    Console.WriteLine("-------------------"); 
    test.Print(message); 
    Console.WriteLine("-------------------"); 
} 

static void Main(string[] args) 
{ 
    ITest test = new CTest(); 
    test.FullPrint("test"); 
} 

public class CTest : ITest 
{ 
    public void Print(string message) 
    { 
     Console.WriteLine(message); 
    } 
} 

我有隻對本接口的實現。

所以,在這種情況下,我的接口是否包含方法?

+4

你有沒有實現有方法的。你只有聲明。 – xanatos

+0

你的代碼缺少'CTest',這是關鍵。 –

+0

@HenkHolterman我已經更新了代碼 –

回答

1

的方法FullPrint收到一個實例某些類型的實現ITest

一個接口,在這個例子中名爲ITest,本質上是一個契約定義。這是一個承諾,任何實現該接口的類型都將包含該接口的已定義方法和屬性。這就是接口沒有實現的原因,它代表了一個承諾/合同。

在您的例子再次,你作出承諾/合同中實現ITest任何類型將包含方法:

void Print(string message); 

你的類型(未顯示CTest實現該接口。然後,您可以創建一個類型爲ITest的參考CTest的實例。

+0

我在msdn上看到,在擴展方法中,它們的第一個參數指定了該方法的操作類型。所以這與他們的具體實施無關,對吧? –

+0

@BudaGavril - 它的**擴展**方法(*不擴展*)。是和否,如果將第一個參數定義爲接口,那麼這是真的,如果將其定義爲類類型,並且可能該類類型是密封的,那麼是的。 – Igor

+0

@BudaGavril擴展方法與接口無關。就我個人而言,我認爲它們就像避免使用在某些情況下非常有用的繼承的一種快速方法。 – bradbury9

1

你有申明一種方法(給它的簽名),但你沒有給它一個執行。接口不能容納實現,基類可以。

你的情況,這將意味着你必須重寫:

public /*abstract */ class TestBase 
{ 
    public virtual void Print(string message) 
    { 
     // implementation 
    } 
} 
1

在你的情況你實現了擴展方法,只能用於聲明爲ITest的類型。 ITest界面不包含FullPrint方法。 可以定義你的基類andimplement接口:

public class Test : ITest 
{ 
    public void Print(string message) 
    { 
    // implementation 
    } 
} 

然後,您可以使用該方法以下列方式:

ITest variable = new Test(); 
variable.FullPrint("Hello");