给定一个模板类,只在三种不同的类型A,B和C上实例化,当模板绑定到一个类型时,有没有办法根据模板类型将外部函数调用绑定到另一个类?
e.g。
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());
}
但这会导致调用函数的运行时动态分辨率和不合需要的设计,因为在我的情况下,Print函数在逻辑上更多地属于打印机。
3)使用动态关键字,这些内容如下:
class template<T> {
private printer myPrinter;
Print(T obj) {myPrinter.Print((dynamic)obj);
}
这里的绑定会发生在我想象的每个函数调用上。
所以,我真正想要的是一个解决方案,将函数保存在打印机类中(消除了两个),没有多次代码(消除1)并动态绑定Print函数而不是每次调用但在模板初始化(消除3)。
基本上我在想创建模板后,运行时环境应该知道每次调用时要调用哪个函数,并且每次调用函数时都不需要进行查找。
所以我的问题是,我的理解是正确的吗?当模板绑定到模板类型或更好的方法时,有没有办法动态绑定?那么使用动态类和多类的开销会是多少?
由于
答案 0 :(得分:0)
使类Print
中的方法printer
成为通用方法。
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);
您可以添加一些where-constraints以使其更好地工作。