2009-06-05 87 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(); 
}