2013-12-14 77 views
1

我有以下爲什麼是C#中的行爲抽象類和接口?

public interface NomiInterface 
{ 
    void method(); 
} 
public abstract class Nomi1 
{ 
    public void method() 
    { 
    } 
} 
public class childe : Nomi1, NomiInterface 
{ 
} 

現在成功編譯的代碼?爲什麼不需要重寫childe類中的接口方法?

+1

您是否注意到接口定義了一個名爲'mehtod'的方法,但抽象類定義了'method'? –

+0

您是否嘗試過新編輯的答案?因爲它現在編譯沒有任何錯誤。你的問題是約翰·桑德斯寫的。 – Kikaimaru

+1

你不需要再次實現它,因爲childe類已經有了從它的父Nomi1實現的「方法」方法。如果您想以其他方式實現它,請將Nomi1中的方法「虛擬」爲虛擬並在childe類中覆蓋它 – Kikaimaru

回答

3

您需要接口的explicit implementation。抽象類方法method()的實現滿足了實現接口抽象方法的需要。因此,在類childe中定義接口的方法,但顯式實現需要調用接口的方法,但不要調用類。

public interface NomiInterface 
{ 
    void method(); 
} 
public abstract class Nomi1 
{ 
    public void method() 
    { 
      Console.WriteLine("abstract class method"); 
    } 
} 
public class childe : Nomi1, NomiInterface 
{ 
    void NomiInterface.method() 
    { 
      Console.WriteLine("interface method"); 
    } 
} 

您可以測試你如何可以調用抽象類和接口的實現目前的方法公子

childe c = new childe(); 
NomiInterface ni = new childe(); 
ni.method(); 
c.method(); 

輸出是

interface method 
abstract class method 

在另一方面,如果你不做明確的接口實現,然後在childe類中給出的實現不會調用childe或接口對象。

public interface NomiInterface 
{ 
    void method(); 
} 
public abstract class Nomi1 
{ 
    public void method() 
    { 
     Console.WriteLine("abstract class method"); 
    } 
} 
public class childe : Nomi1, NomiInterface 
{ 
    void method() { Console.WriteLine("interface method"); } 
} 

像我們以前那樣創建類和接口的對象。

childe c = new childe(); 
NomiInterface ni = new childe(); 
ni.method(); 
c.method(); 

輸出你會得到

abstract class method 
abstract class method 

作爲附加的註釋,你將採取命名類/方法名稱約定的照顧。你可以找到更多關於命名約定here

+1

問題是他在界面上的__mehtod__中存在拼寫錯誤。這個答案只是令人困惑。 – Kikaimaru

+0

@Kikaimaru - OP詢問實現的來源,抽象類以及爲什麼不重寫。阿迪爾的回答解釋了這一點。 – Tim

+0

@Tim問題在我評論後編輯。但我仍然不明白這個答案。答案是他不需要在孩子中實現它,因爲父母已經實現了它,並且它沒有被覆蓋,因爲沒有人覆蓋它。顯式接口實現對任何事情都沒有幫助。 – Kikaimaru

相關問題