2009-06-05 64 views
0

想象你有以下接口:如何將接口轉換爲其子接口?

public interface IInterfaceA : IInterfaceX 
{ 
    // 
    // declarations 
    // 
} 

public interface IInterfaceB : IInterfaceX 
{ 
    // 
    // declarations 
    // 
} 

public interface IInterfaceC : IInterfaceX 
{ 
    // 
    // declarations 
    // 
} 

現在我想,以取代執行幾乎同樣的具有單一功能的以下三種方法:

class SomeClass 
{ 
    IInterfaceA myVarA; 
    IInterfaceB myVarB; 
    IInterfaceC myVarC; 

    void SomeMethodA(IInterfaceX someVarX) 
    { 
     myVarA = (IInterfaceA)someVarX; 
    } 

    void SomeMethodB(IInterfaceX someVarX) 
    { 
     myVarB = (IInterfaceB)someVarX; 
    } 

    void SomeMethodC(IInterfaceX someVarX) 
    { 
     myVarC = (IInterfaceC)someVarX; 
    } 
} 

我想過是這樣的:

void SomeMethod(IInterfaceX targetVar, IInterfaceX someVarX) 
{ 
    // 
    // here's my problem 
    // 
    targetVar = (CastIDontKnowHowToPerform)someVarX; 
} 

這是使用某物。像

SomeMethod(myVarA, someVarX);   
SomeMethod(myVarB, someVarX);   
SomeMethod(myVarC, someVarX);   

所以我的問題是:

  • 是否有可能是我想?

  • 如何執行此演員我不知道如何執行?

  • 也許一個設計模式是比較合適的

我只是在尋找由一個單一的一個替換它們重構,這三項功能的最佳途徑。

事情我試過到目前爲止: 我用過的東西像object.GetType()和object.GetType()GetInterfaces(),這能很好地得到對象的類型或它的接口(S)。但沒有到設置爲其接口的對象的類型。

希望你能幫助我...

問候,

的Inno

[編輯] 啊,該死的......點擊 「問你的問題」,並有後簡單的看一下它,這似乎是一個通用函數(或C++中的模板 - 術語)的典型情況。 [/編輯]

+0

C++模板允許多於C#泛型,它們不是等價的。 – workmad3 2009-06-05 09:53:51

+0

不,它們不是等效的,但是在C++中,你會使用一個模板來實現這一點。 – Inno 2009-06-05 11:02:15

回答

9
void SomeMethod<T>(out T targetVar, IInterfaceX someVarX) where T: IInterfaceX 
{ 
     targetVar = (T) someVarX; 
} 
2

一種可能性是 「is」 操作符:

void SomeMethod(IInterfaceX someVarX) 
{ 
    if (someVarX is IInterfaceA) 
     SomeMethodA((IInterfaceA)someVarX); 
    else if (... 
} 

一個更好的方法是把操作進IInterfaceX完全避免鑄造:

void SomeMethod(IInterfaceX someVarX) 
{ 
    someVarX.SomeMethod(); 
}