2013-04-17 63 views
5

比方說,我有很多很多不同的類實現一個接口:的解決方法是不能把代碼接口

public interface IHaveObjects 
{ 
    object firstObject(); 
} 

(注:我不能讓一個抽象基類IHaveObjects的實現者已經有一個基類。)

現在我想添加一個新的方法到接口,以便接口的一個實現者可以有它的特殊行爲。然而,它在C#中禁止在提供一種方法體

public class ObjectHaverPlus : IHaveObjects 
{ 
    public override object IHaveObjects.firstObjectOrFallback() 
    { 
     return firstObject() ?? getDefault(); 
    } 
} 

:理想情況下,我會做這樣的事情:

public interface IHaveObjects 
{ 
    object firstObject(); 
    object firstObjectOrFallback() 
    { 
     return firstObject(); 
    } 
} 

然後進入界面的一個實現者,並給它的覆蓋接口,並且我想避免讓IHaveObjects的每個實施者落入firstObjectOrFallback()的定義中。 (想象一下,如果有成百上千)

有沒有辦法做到這一點,沒有大量的複製粘貼?

+1

爲什麼不爲該特殊情況創建第二個界面?你不能有多個類的繼承,但你可以實現多個接口。 – Tim

回答

2

如何引入從IHaveObjects繼承的第二個接口。

比你只需要改變這些類,這需要新的方法的新接口。

這看起來像:

interface I1 
    { 
     void Method1(); 
    } 

    interface I2 : I1 
    { 
     void Method2(); 
    } 
+0

噢......我喜歡這個......在我的答案中,甚至沒有想過繼承。傻我:) – Tim

+0

是的,但這是不可能在C#中。我給了他另一種方式。 – Tomtom

+0

@Tomtom我認爲這是我想要做的。這意味着要做另一次檢查,看看對象是否是擴展接口,但這應該沒問題。謝謝 – Patashu

1

我可能誤解了你的問題,但爲什麼不使用第二個接口,是這樣的:

public interface IHaveObjectsEnhanced 
{ 

    object FirstObjectOrFallback(); 
} 

然後你可以實現第一和第二界面:

public class ObjectHaverPlus : IHaveObjects, IHaveObjectsEnhanced 
{ 

    public object FirstObject() 
    { 

    } 

    public object FirstObjectOrFallback() 
    { 
     return FirstObject() ?? GetDefault(); 
    } 

} 
2

這就是接口的問題 - 它們沒有任何默認的實現,所以對它們的改變正在改變 - 即需要修改代碼以使用新版本的界面。

由於您的實現已經擁有基類 - 您不能將其變爲抽象類,C#也沒有多個類繼承。

你可以做的是思考 - 它真的是一個接口方法嗎?或者它可以在界面上實現爲extension method(沒有嘗試,但我認爲它會工作得很好)?

如果它是一種接口方法,它應該停留在那裏 - 你可能會想到將這個接口分成兩部分,第二部分從第一部分繼承(IHaveObjectsAndSupportDefault : IHaveObjects),並使用這個接口,其中真正需要默認值答案表明)。

相關問題