2013-06-18 10 views
5

我基本上在Inherited類中定義了兩次IFoo。這是否會導致一些無法預料的後果?在繼承類上多次定義接口

interface IFoo { 
    ... 
} 

interface IBar : IFoo { 
    ... 
} 

class Base : IFoo { 
    ... 
} 

class Derived : Base, IBar { 
    ... 
} 

我要讓IBar繼承IFoo的原因是這樣我就可以Derived工作,因爲它是IFoo而不必強制轉換。

if (Derived is IBar) 
    // Do work 

如果它不繼承,我必須施放它。這使得使用更加複雜,並且該類的用戶可能不瞭解IBar只是IFoo的專業化。

if (Derived is IBar) 
    Derived as IFoo 
    // Do work 

這是不好的做法?對於這個問題還有哪些其他解決方案?

+0

爲什麼你想要做if(Derived is IBar)Derived as IFoo'?爲什麼不'if(派生是IFoo)'而不是? –

+0

因爲IBar是一個標記接口,它告訴我「派生」是一個特定的類型。這樣我可以將所有IFoo保存在一個集合中,並與他們一起工作。我應該只需要在IBar類型上「做功」就可以做.OfType 。 –

回答

5

它不會在代碼方面導致任何不可預見的情況。這只是多餘的。

本代碼:

if (Derived is IBar) 
    Derived as IFoo 

這是完全不必要的,因爲DerivedIFoo,給你的聲明 - 所以不要這麼做!

請注意,即使IBar不是從IFoo派生,您仍然不需要Derived as IFoo。鑑於:

interface IFoo {} 

interface IBar {} 

class Base : IFoo {} 

class Derived : Base, IBar 
{ 
} 

那麼這個編譯OK:

var derived = new Derived(); 

IBar bar = derived; // Fine. 
IFoo foo = derived; // Also fine. 
+0

'IFOO派生出來就是我不得不從'IFoo'派生出來的一個例子 –

+0

@Snæbjørn但事實並非如此,即使IBar不是從IFoo派生出來的,基地'已經這樣做,所以你不需要'衍生作爲IFoo'。看到我更新的答案。 –

+0

啊,是的,這是正確的。我開始意識到我沒有正確解釋這個問題:(你的建議是我通常會這麼做的,也許是我應該怎麼做的。這可能應該是另一篇文章,但是在這裏。我想從列表中提取所有'IBar',我使用'list.OfType '的問題是我不能將這個列表存儲在'List '中,而沒有使用'List ' '.Cast '這是不直觀的。我開始懷疑我的設計:) –

1

您可以明確定義的實現爲Interface和行爲,以便區分

class Derived : Base, IBar { 

    void IBar.Method(){ 

    } 

    void Base.Method() { 

    } 
} 

除此之外,你可以這樣做,但這是多餘的,可能會導致混淆。見MSDN

+0

是甚至合法的語法? –

+0

我錯了'override',MSDN文章說你可以這樣做。 VS甚至提供這個功能 –

+0

我認爲這些方法應該是'private',那麼你正在實現一個像這樣的接口 –

1

如果我正確理解你,你有一個層次的接口和一個層次的類互相鏡像。每個類通過繼承其基類並實現所需的其他成員來實現相應的接口。

這很好,我也是這樣做的。我不知道有什麼更好的辦法做到這一點 - 這一個很好的方法。

我認爲IBar應該像您的主要建議一樣擴展IFoo,否則消費者需要投入很多。另外,既然你考慮IBoo專業的IFoo,也使其在代碼中的專業,所以使其擴大IFoo。