C#:当模板绑定到类型时动态绑定函数
给定一个只在三种不同类型a、B和C上实例化的模板类,当模板绑定到一个类型时,有没有方法基于模板类型将外部函数调用绑定到另一个类 e、 gC#:当模板绑定到类型时动态绑定函数,c#,generics,binding,C#,Generics,Binding,给定一个只在三种不同类型a、B和C上实例化的模板类,当模板绑定到一个类型时,有没有方法基于模板类型将外部函数调用绑定到另一个类 e、 g 类模板{ 私人打印机; Print(T obj){myPrinter.Print(obj); } 类打印机{ 公共印刷(obj){}; 公共印刷(B obj){}; 公共印刷(C obj){}; } 现在据我所知,上述措施将不起作用 这让我可以选择 1) 编写三个不同的类而不是模板(代码编写三次,然后在编译时静态绑定调用) 2) 更改设计,使打印功能包含在对
类模板{
私人打印机;
Print(T obj){myPrinter.Print(obj);
}
类打印机{
公共印刷(obj){};
公共印刷(B obj){};
公共印刷(C obj){};
}
现在据我所知,上述措施将不起作用
这让我可以选择
1) 编写三个不同的类而不是模板(代码编写三次,然后在编译时静态绑定调用)
2) 更改设计,使打印功能包含在对象A、B和C中,并且模板更改为
class template<T> where T : IPrintable {
private printer myPrinter;
Print(T obj) {obj.Print());
}
类模板,其中T:IPrintable{
私人打印机;
Print(tobj){obj.Print());
}
但这将导致要调用的函数的运行时动态解析,在我的例子中,打印函数在逻辑上更多地属于打印机
3) 使用dynamic关键字,可以根据以下内容:
class template<T> {
private printer myPrinter;
Print(T obj) {myPrinter.Print((dynamic)obj);
}
类模板{
私人打印机;
Print(T obj){myPrinter.Print((动态)obj);
}
这里的绑定将发生在我想象中的每个函数调用上
因此,我真正想要的是一个解决方案,它将函数保留在printer类中(消除两个),不需要多次使用代码(消除1个),并且不是在每次调用时动态绑定Print函数,而是在模板初始化时动态绑定Print函数(消除3个)
基本上,我认为只要创建了模板,运行时环境就应该知道每次调用要调用哪个函数,而不需要每次调用该函数时都进行查找
所以我的问题是,我的上述理解正确吗?当模板绑定到一个模板类型时,有没有一种方法可以动态绑定,或者有更好的方法可以执行上述操作?使用动态类和多个类的开销是多少
感谢在课堂
打印机中使方法打印成为一种通用方法
class Printer
{
public Print<T>(T obj)
{
if(obj is A) DoLogicForTypeA();
else if (obj is B) DoLogicforTypeB();
else throw new IllegalArgumentException();
}
}
类打印机
{
公共印刷品(T obj)
{
如果(obj是A)DoLogicForTypeA();
如果(obj是B)DoLogicforTypeB();
else抛出新的IllegalArgumentException();
}
}
调用模板通用:
Print(T obj) {myPrinter.Print<T>(obj);
Print(tobj){myPrinter.Print(obj);
您可能可以添加一些where约束以使其更好地工作。@codymanix他似乎正在命名他的类模板。@Cookie:建议对类使用大写。同样,这并没有给我足够的自由来执行打印函数。如果type=a,我基本上需要a,使用内部成员订阅fora,如果type=B,use Subscriptions for B,…我用if结构编辑了它。如果您认为DoLogicForTypeA
和DoLogicforTypeB
有很多共同点,请为公共内容定义一个接口,并定义Constant其中T:InterfaceCommonToTypes
。然后您可以在Pri中使用对象InterfaceCommonMethodOrProperty
nt(T obj)
方法。
Print(T obj) {myPrinter.Print<T>(obj);