同一个界面如何在界面中使用不同的模板参数两次?我认为这个例子会让它更清楚。我们希望在处理程序类中看到两个具有不同参数的方法。“int过程(int值);”“双重过程(双重价值);”但是编译器说IR91:'Generics.IRoot'cannotimplementboth'Generics.IProcess'and'Generics.IProcess'becausetheymayunifysomethingsometypeparametersubstitutions.publicclassProcessor:IRoot{//这里我们需要2个方法publicintProcess(intitem){}publicdoubleProcess(doubleitem){}}publicinterfaceIProcess{TResultProcess(TItemitem);}publicinterfaceIRoot:IProcess,IProcess{}你可以使用这个实现。您将丢失一些通用参数:publicinterfaceIBasewhereTM:bTypewhereTPkey:new(){TMGet(TPkeykey);}publicinterfaceIABase:IBase{}publicinterfaceIBase:IBase{}publicclassRoot:IABase,IBBasewhereTM:MTypewhereTPM:PMTypewhereTPK:new(){ConcreteTmAIABase.Get(TPKkey){}ConcreteTmBIBBase。Get(TPKkey){}}因此,在发布我对这个问题的第一个答案(#1)之后,我意识到人们通常可能希望能够将差异化接口的值转换为非差异化接口。换句话说,人们会想做一些像IProcessWithDifferentiator:IProcess这样的事情,但我们不能,因为我们在使用接口时会遇到同样的错误(类型可能是统一的)。我注意到OP没有特别要求这样做,但可以看出这将是下一个合乎逻辑的场景。所以,回到绘图板,回到一个丑陋的解决方案,这是一个返回向下转换类型的方法,以及一个支持构建这个方法的代理。(丑陋的唯一缓刑是代理类可以在一定程度上重用,如下所示。)下面是这个练习的结果。publicinterfaceSecond{}publicinterfaceThird{}publicclassProcessor:IRoot{//这里我们需要3个方法publicfloatProcess(floatitem){System.Console.WriteLine("...floatProcess...");返回(浮动)(项目-55.75);}publicintProcess(intitem){System.Console.WriteLine("...intProcess...");返回项目+1;}publicdoubleProcess(doubleitem){System.Console.WriteLine("...doubleProcess...");返回项目+10.748;}IProcessIProcessWithDifferentiator.ConvertToBase(){returnnewTP_Proxy(this);}IProcessIProcessWithDifferentiator.ConvertToBase(){returnnewTP_Proxy(this);}}publicclassTestProcessor:IRoot{intIProcess.Process(intitem){System.Console.WriteLine("...intProcess1...");返回项目-11;}intIProcessWithDifferentiator.Process(intitem){System.Console.WriteLine("...intProcess2...");返回项目+12;}intIProcessWithDifferentiator.Process(intitem){System.Console.WriteLine("...intProcess3...");返回项目+100302;}IProcessIProcessWithDifferentiator.ConvertToBase(){returnnewTP_Proxy(this);}IProcessIProcessWithDifferentiator.ConvertToBase(){returnnewTP_Proxy(this);}}publicinterfaceIProcess{TResultProcess(TItemitem);}publicinterfaceIProcessWithDifferentiator//很想在这里使用“:IProcess”,但不会在上面工作{TResultProcess(TItemitem);//从IProcess复制方法...yuck(!)IProcessConvertToBase();}//有一个代理很烂。但至少这个代理在实现IProcess概念的多个类之间共享。类TP_Proxy:IProcess{publicTP_Proxy(IProcessWithDifferentiatorpx){_proxyTo=px;私人IProcessWithDifferentiator_proxyTo;TResultIProcess.Process(TItemitem){return_proxyTo.Process(item);}}公共接口IRoot:IProcess,IProcessWithDifferentiator,IProcessWithDifferentiator{}classProgram{staticvoidMain(string[]args){Processorp=newProcessor();//直接转换第一个,当然是IProcessa1=p;System.Console.WriteLine("a1.Process(3.3)="+a1.Process((float)3.3));//微分类的转换IProcessWithDifferentiatora2=((IProcessWithDifferentiator)p);System.Console.WriteLine("a2d.Process(4)="+a2.Process(4));IProcessWithDifferentiatora3=(IProcessWithDifferentiator)p;System.Console.WriteLine("a3d.Process(5.5)="+a3.Process(5.5));//使用丑陋的代理转换为未区分的类IProcessa2u=((IProcessWithDifferentiator)p).ConvertToBase();System.Console.WriteLine("a2u.Process(4)="+a2u.Process(4));IProcessa3u=((IProcessWithDifferentiator)p).ConvertToBase();System.Console.WriteLine("a3u.Process(5.5)="+a3u.Process(5.5));TestProcessorq=newTestProcessor();I进程b1=q;//直接转换first一,当然是System.Console.WriteLine("b1.Process(3)="+b1.Process(3));//微分类的转换IProcessWithDifferentiatorb2d=(IProcessWithDifferentiator)q;System.Console.WriteLine("b2d.Process(4)="+b2d.Process(4));IProcessWithDifferentiatorb3d=(IProcessWithDifferentiator)q;System.Console.WriteLine("b3d.Process(5)="+b3d.Process(5));//使用丑陋的代理转换为未区分的类IProcessb2u=((IProcessWithDifferentiator)q).ConvertToBase();System.Console.WriteLine("b2u.Process(4)="+b2u.Process(4));IProcessb3u=((IProcessWithDifferentiator)q).ConvertToBase();System.Console.WriteLine("b3u.Process(5)="+b3u.Process(5));System.Console.ReadLine();}}输入如下:...floatProcess...a1.Process(3.3)=-52.45...intProcess...a2d.Process(4)=5...doubleProcess...a3d.Process(5.5)=16.248...intProcess...a2u.Process(4)=5...doubleProcess...a3u.Process(5.5)=16.248...intProcess1...b1.Process(3)=-8...intProcess2...b2d.Process(4)=16...intProcess3...b3d.Process(5)=100307...intProcess2...b2u.Process(4)=16...intProcess3...b3u.Process(5)=100307问题正是错误消息所说的:'IRoot'不能同时实现“IBase”和“IBase”,因为它们可能会统一某些类型参数替换例如你可以这样做:公共类测试:IRoot在这种情况下,它将有两个IBase继承链,这是不允许的一如既往,请尝试包括您遇到的问题以及问题的代码。这是我的解决方案。它基于使用差异化,因此您知道需要哪个界面。您必须添加一个未使用的参数,但这就是告诉它您想要什么的原因。publicinterfaceFirst{}publicinterfaceSecond{}publicclassProcessor:IRoot{//这里我们需要2个方法publicintProcess(intitem){System.Console.WriteLine("intProcess");返回项目+1;}publicdoubleProcess(doubleitem){System.Console.WriteLine("doubleProcess");返回项目+10.748;}}publicclassTestProcessor:IRoot{intIProcessWithDifferentiator.Process(intitem){System.Console.WriteLine("intProcess");返回项目+1;}intIProcessWithDifferentiator.Process(intitem){System.Console.WriteLine("intProcess");返回项目+100302;}}publicinterfaceIProcessWithDifferentiator{TResultProcess(TItemitem);}publicinterfaceIRoot:IProcessWithDifferentiator,IProcessWithDifferentiator{}classProgram{staticvoidMain(string[]args){Processorp=newProcessor();IProcessWithDifferentiatorone=p;System.Console.WriteLine("one.Process(4)="+one.Process(4));IProcessWithDifferentiator二=p;System.Console.WriteLine("two.Process(5.5)="+two.Process(5.5));TestProcessorq=newTestProcessor();IProcessWithDifferentiatorq1=q;System.Console.WriteLine("q1.Process(4)="+q1.Process(4));IProcessWithDifferentiatorq2=q;System.Console.WriteLine("q2.Process(5)="+q2.Process(5));System.Console.ReadLine();这是输出intProcessone.Process(4)=5doubleProcesstwo.Process(5.5)=16.248intProcessq1.Process(4)=5intProcessq2.Process(5)=100307即使你使用IRoot,如上所示,这也适用于IRoot;它知道(因为我们告诉它)要使用哪个IDiferentialedProcess。(如果重要的话,我在VisualStudio2012上。)据我所知,您想定义这样的接口:publicinterfaceIRootwhereTM:MTypewhereTPM:PMTypewhereTPK:new(){TMGet(TPK钥匙);TPM获取(TPK密钥);这是不可能的,因为您不能定义两个具有相同名称和相同参数的方法。错误CS0111:类型“IRoot”已经定义了一个名为“Get”的具有相同参数类型的成员尝试直接定义您的接口(没有继承)并更改方法名称。例如:publicinterfaceIRootwhereTM:MTypewhereTPM:PMTypewhereTPK:new(){TMGetTM(TPKkey);TPMGetTPM(TPK密钥);很抱歉看到你有这么多票,我面临着同样的问题。遗憾的是,这似乎不可能-这个MSDN页面列出了唯一可能的通用类型约束,没有人可以表达约束“T和U可以是任何类型,但必须具有不同的继承层次结构”http://msdn.microsoft.com/en-us/library/d5x73970(v=VS.80).aspx我们确实需要某种whereT!:U或whereT,U不相交的语法;但就目前而言,编译器无法指定TItem1和TItem2实例永远不能相互替换。以上是C#学习教程:如何在界面中使用不同的模板参数两次使用同一个界面?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
