2011-05-03 57 views
1

给定一个模板类,将只实例化说三个不同类型A,B和C,有没有办法将外部函数调用绑定到另一个类基于模板绑定到某个类型时的模板类型?C#:动态绑定一个函数,当模板绑定到类型

例如

class template<T> { 
    private printer myPrinter; 
    Print(T obj) {myPrinter.Print(obj); 
} 

class printer { 
    public Print(A obj){}; 
    public Print(B obj){}; 
    public Print(C obj){}; 
} 

现在以我的理解上面不起作用。

这给我留下了选择的

1)编写三个不同的类别,而不是模板(具有代码三次,然后在编译时静态绑定的电话)。

2)改变设计,使得打印功能被包括在对象A,B和C,以及模板变化

class template<T> where T : IPrintable { 
    private printer myPrinter; 
    Print(T obj) {obj.Print()); 
} 

但是这将导致运行时功能的动态分辨率调用而且在我的情况下,打印功能在逻辑上更多地属于打印机。

3)使用动态关键字,这些方针的东西:

class template<T> { 
    private printer myPrinter; 
    Print(T obj) {myPrinter.Print((dynamic)obj); 
} 

结合在这里会发生在每个函数调用我会想象。因此,我真正想要的是一个解决方案,它保持打印机类中的功能(消除两个),多次没有代码(消除1),并且动态地绑定打印功能,而不是每次调用但模板初始化(消除3)。

基本上我一开始创建模板就会想,运行时环境应该知道每次调用哪个函数,每次调用该函数时都不需要执行查找。

所以我的问题是,我的理解是正确的?当模板绑定到模板类型或者更好的方法做到上面时,是否有动态绑定的方法?什么是使用动态与多个类的开销?

感谢

+1

@codymanix他似乎在命名他的班级模板。 @Cookie:建议使用大写的类。 – LueTm 2011-05-03 17:09:33

回答

0

制作方法Printprinter类的通用方法。

class Printer 
{ 
    public Print<T>(T obj) 
    { 
    if(obj is A) DoLogicForTypeA(); 
    else if (obj is B) DoLogicforTypeB(); 
    else throw new IllegalArgumentException(); 
    } 
} 

调用模板通用:

Print(T obj) {myPrinter.Print<T>(obj); 

你也许可以添加一些地方的约束,以使其更好地工作。

+0

同样,这不足以让我的打印功能有足够的自由度。我基本上需要一个if类型= A,使用内部成员subscriptionsForA,如果type = B,使用subscriptionsForB,... – Cookie 2011-05-04 09:15:24

+0

我用if结构编辑它。如果你认为'DoLogicForTypeA'和'DoLogicforTypeB'有很多共同之处,为常见的东西定义一个接口并且定义一个常量'where T:InterfaceCommonToTypes'。然后你可以使用'obj。在'Print (T obj)'方法内的InterfaceCommonMethodOrProperty'。 – ZoolWay 2011-05-04 09:21:01