2013-08-31 41 views
-1

我有一個接口,其中包含假設10-方法,它是繼承到類說class1.My的要求是我不想繼承2方法到class1 .so如何在c#中可能.net如何不在界面中繼承某些功能?

+3

這不是,至少不是你所期待的。如果一個類實現了一個接口,它必須實現*整個接口。 (這就是使它成爲接口的原因......它是由該類提供的功能契約。)如果要挑選並選擇要實現的部分,則需要多個較小的接口。嘗試將接口應用於實際上未被該接口描述的類是違反了Liskov替換原則。 – David

+1

你可以讓你的class1抽象或繼承,但是會拋出NotSupportedException。 – Diryboy

+3

@Diryboy:仍然是對Liskov替換的違反。這些對象應該準確地描述它們所暴露的功能。接口和抽象類不僅僅是爲了可能需要或不需要的功能傾倒基礎。 – David

回答

6

你可能分裂的接口2,和你的類實現只有一個:

public interface Ifc1 { 
    void Method1(); 
} 
public interface Ifc2 { 
    void Method2(); 
} 
class Cls1 : Ifc1 { 
    // now you need to implement Method1 only 
} 

或者,你可以拋出一個NotImplementedExceptionMethod2

class Cls1 : Ifc1 { 
    public void Method2() { 
     throw new NotImplementedException(); 
    } 
} 

我會去的冷杉t選項,如果可能的話。

如果拋出異常,您只會發現在調用該方法時不支持該方法。你將不得不趕上這個例外,你寫的代碼將不得不處理這個問題,並且不會那麼幹淨。

如果你拆分接口,相反,你的類將只是沒有你不想實現的方法。

+0

界面應該分開。不要拋出異常,您實現接口的事實表明您支持接口定義的所有行爲。 –

0

創建混搭系統。

你的課應該實現整個接口,因爲在你的問題的上下文中確實沒有其他選擇。其他答案可以爲您提供有關更改接口設計人員設置的不正確語義的指導。

你的類實現了接口,但是你的類本身依賴於將來實現該工作的實現者。

你的類應該派生自一個包含抽象函數的類。這些抽象函數將在您的類的接口實現中被「調用」。但是,由於你的類包含未解決的抽象內容,因此它不會直接實例化,所以不會直接實例化。另一個類繼承自你的類,並具體實現抽象函數或在近期的替代和可能的場景中實現抽象函數,拋出不支持的異常。

通過這種方式,您可以在不違反任何原則的情況下實現自己的能力,但將基本衝突傳遞給待定班級。通過這種方式,你可以向前邁進一步,但是避免了衝突。未來的執行者可以依靠你的前進步驟作爲一個正確的基礎行動,但必須解決並逆轉你的橫向運動,做一個比喻。