2015-12-02 60 views
-2

我試圖瞭解接口,我在這個頁面看到一個例子,但它本身並不是一個接口的例子。正確的方式來實現一個接口

我瞭解什麼接口:

  • 是類實現(方法,屬性,事件等)與接口之間的合同。

  • 因爲在C#和.NET中,你不能多重繼承,所以你可以使用接口,在那裏你可以使用你不能繼承的那個類的方法,屬性等等。

所以這是一個示範只和我的嘗試: (在不同的類)

class Father 
{ 
} 

class Mother : IMother 
{ 
    public string Hello() 
    { 
     return "Im the mother"; 
    } 
} 

public interface IMother 
{ 
    string Hello(); 
} 

class Son : Father,IMother 
{ 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Son son1 = new Son(); 
     son1.Hello() // --> Hello does not exist. 
    } 
} 

我到底做錯了什麼?

謝謝。

+1

'子'沒有實現'IMother.Hello' –

+0

代碼不能編譯,你必須在子類中實現Hello()。你怎麼試過這個? – Alex

+1

一般來說,一個兒子不是父親和母親。這使得這個例子令人困惑 –

回答

2

我做錯了什麼?

您不在Son的任何地方實施Hello的繼承鏈。如果下面的任何一個被改變,你會正確地實現接口:從Mother

  • Son繼承,而不是從Mother
  • FatherFather
  • Father繼承實現Hello
  • Son實現Hello

接口可以不可以可用於多個繼承。繼承僅適用於執行 - 您可以執行多個接口,但不能繼承多個實現。

如果你有多個類,你想重新使用的實現,然後組成通常是最好的方式來做到這一點。 Son類將引用FatherMother對象,並通過屬性公開它們或創建傳遞屬性和方法以獲取底層實現。

+0

我現在明白了,如果不是有「父親」,「母親」,我有父子雙方繼承祖父和父親的祖父,父親和兒子有一種子可以使用的方法太。所以在這種情況下我使用一個接口,我看到的是繼承的「金字塔」倒退。謝謝。 – Nickso

-1

我們使用Interfaces來處理抽象而不是具體的實現,爲什麼?簡單的答案是使測試容易假的來代替我們的類,它創建模塊化應用程序(OOP)

要解決你的代碼,你必須改變這條線走接口變量,而不是類:

IMother son1 = new Son(); 
son1.Hello() // --> Now exists. 
直到你實現子類

class Son : Father, IMother 
    { 
     public string Hello() 
     { 
      throw new NotImplementedException(); 
     } 
    } 

如果你不想實現兒子的接口方法裏面的接口方法

您的代碼將不會反正工作,你要訪問的方法在母級,那麼你必須繼承Mother instea Son班的父親班。

+0

你是什麼意思,「我們使用接口來處理抽象而不是具體的實現」? 你能舉個例子嗎? – Nickso

+0

@DStanley我提到過,我展示瞭如何實現Hello方法。 –

+0

@Nickso例子是IMother myClassVar = new Son();那麼在第二行你可以說myClassVar = new Mother();你可以切換實現使用類實現相同的接口 –

相關問題