c#:当模板绑定到类型时动态绑定函数
本文关键字:类型 动态绑定 函数 绑定 | 更新日期: 2023-09-27 17:54:21
给定一个模板类,它只会在三种不同的类型a, B和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());
}
,但这将导致要调用的函数的运行时动态解析,并且在一个不受欢迎的设计中,如在我的情况下,Print函数在逻辑上更属于打印机。
3)使用动态关键字,如下所示:
class template<T> {
private printer myPrinter;
Print(T obj) {myPrinter.Print((dynamic)obj);
}
这里的绑定将发生在我想象的每个函数调用上。
所以,我真正寻找的是一个解决方案,保持函数在打印机类(消除两个),没有代码多次(消除1),并动态绑定打印函数不是在每次调用,而是在模板初始化(消除3)。
基本上,我认为一旦模板创建,运行时环境应该知道每次调用调用哪个函数,而不应该每次调用函数都需要进行查找。
所以我的问题是,我的理解是正确的吗?当模板绑定到模板类型时,是否有一种方法可以动态绑定,或者上面有更好的方法?使用动态类和使用多个类的开销是什么?谢谢
使printer
类中的Print
方法为泛型方法
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来使它更好的工作。