所以張貼我首先回答這個問題(#1)後,我才明白,人們常常會希望能夠將一個值從轉換與非差異化界面的差異化界面。換句話說,一個想要做以下
IProcessWithDifferentiator<TRes, TItem, TDiff> : IProcess<TRes, TItem>
但我們不能因爲我們會碰到同樣的錯誤使用接口時(類型可能統一)。
我注意到OP沒有特別要求這一點,但可以看到它將是下一個邏輯場景。
因此,回到繪圖板,並返回一個醜陋的解決方案,這是有一個方法返回向下轉換的類型,和一個代理來支持這種方法的構造。 (唯一可以緩解的問題是,如下所示,代理類可以稍微重用。)以下是本練習的結果。
public interface Second { }
public interface Third { }
public class Processor : IRoot<float, int, double, float, int, double>
{
// Here we want 3 methods
public float Process (float item) { System.Console.WriteLine (" ...float Process..."); return (float) (item - 55.75); }
public int Process (int item) { System.Console.WriteLine (" ...int Process..."); return item + 1; }
public double Process (double item) { System.Console.WriteLine (" ...double Process..."); return item + 10.748; }
IProcess<int, int> IProcessWithDifferentiator<int, int, Second>.ConvertToBase()
{
return new TP_Proxy<int, int, Second> (this);
}
IProcess<double, double> IProcessWithDifferentiator<double, double, Third>.ConvertToBase()
{
return new TP_Proxy<double, double, Third> (this);
}
}
public class TestProcessor : IRoot<int, int, int, int, int, int>
{
int IProcess<int, int>.Process (int item)
{
System.Console.WriteLine (" ...int Process1..."); return item - 11;
}
int IProcessWithDifferentiator<int, int, Second>.Process (int item)
{
System.Console.WriteLine (" ...int Process2..."); return item + 12;
}
int IProcessWithDifferentiator<int, int, Third>.Process (int item)
{
System.Console.WriteLine (" ...int Process3..."); return item + 100302;
}
IProcess<int, int> IProcessWithDifferentiator<int, int, Second>.ConvertToBase()
{
return new TP_Proxy<int, int, Second> (this);
}
IProcess<int, int> IProcessWithDifferentiator<int, int, Third>.ConvertToBase()
{
return new TP_Proxy<int, int, Third> (this);
}
}
public interface IProcess<TResult, TItem>
{
TResult Process (TItem item);
}
public interface IProcessWithDifferentiator<TResult, TItem, TDiff> // would love to ": IProcess<TResult, TItem>" here but won't work above
{
TResult Process (TItem item); // replicated method from IProcess... yuck(!)
IProcess<TResult, TItem> ConvertToBase();
}
// Having a proxy sucks. But at least this proxy is shared among multiple classes implementing the IProcess concept.
class TP_Proxy<TResult, TItem, TDiff> : IProcess<TResult, TItem>
{
public TP_Proxy (IProcessWithDifferentiator<TResult, TItem, TDiff> px) { _proxyTo = px; }
private IProcessWithDifferentiator<TResult, TItem, TDiff> _proxyTo;
TResult IProcess<TResult, TItem>.Process (TItem item) { return _proxyTo.Process (item); }
}
public interface IRoot<TR1, TR2, TR3, TItem1, TItem2, TItem3> :
IProcess<TR1, TItem1>,
IProcessWithDifferentiator<TR2, TItem2, Second>,
IProcessWithDifferentiator<TR3, TItem3, Third>
{
}
class Program
{
static void Main (string [] args)
{
Processor p = new Processor();
// Direct conversion of first one, of course
IProcess<float, float> a1 = p;
System.Console.WriteLine ("a1 .Process(3.3) = " + a1.Process ((float) 3.3));
// Conversion of differentiated class
IProcessWithDifferentiator<int, int, Second> a2 = ((IProcessWithDifferentiator<int, int, Second>) p);
System.Console.WriteLine ("a2d.Process(4) = " + a2.Process (4));
IProcessWithDifferentiator<double, double, Third> a3 = (IProcessWithDifferentiator<double, double, Third>) p;
System.Console.WriteLine ("a3d.Process(5.5) = " + a3.Process (5.5));
// Conversions to undifferentiated class using ugly proxies
IProcess<int, int> a2u = ((IProcessWithDifferentiator<int, int, Second>) p).ConvertToBase();
System.Console.WriteLine ("a2u.Process(4) = " + a2u.Process (4));
IProcess<double, double> a3u = ((IProcessWithDifferentiator<double, double, Third>) p).ConvertToBase();
System.Console.WriteLine ("a3u.Process(5.5) = " + a3u.Process (5.5));
TestProcessor q = new TestProcessor();
IProcess<int, int> b1 = q;
// Direct conversion of first one, of course
System.Console.WriteLine ("b1 .Process(3) = " + b1.Process (3));
// Conversion of differentiated class
IProcessWithDifferentiator<int, int, Second> b2d = (IProcessWithDifferentiator<int, int, Second>) q;
System.Console.WriteLine ("b2d.Process(4) = " + b2d.Process (4));
IProcessWithDifferentiator<int, int, Third> b3d = (IProcessWithDifferentiator<int, int, Third>) q;
System.Console.WriteLine ("b3d.Process(5) = " + b3d.Process (5));
// Conversions to undifferentiated class using ugly proxies
IProcess<int, int> b2u = ((IProcessWithDifferentiator<int, int, Second>) q).ConvertToBase();
System.Console.WriteLine ("b2u.Process(4) = " + b2u.Process (4));
IProcess<int, int> b3u = ((IProcessWithDifferentiator<int, int, Third>) q).ConvertToBase();
System.Console.WriteLine ("b3u.Process(5) = " + b3u.Process (5));
System.Console.ReadLine();
}
}
輸出如下:
...float Process...
a1 .Process(3.3) = -52.45
...int Process...
a2d.Process(4) = 5
...double Process...
a3d.Process(5.5) = 16.248
...int Process...
a2u.Process(4) = 5
...double Process...
a3u.Process(5.5) = 16.248
...int Process1...
b1 .Process(3) = -8
...int Process2...
b2d.Process(4) = 16
...int Process3...
b3d.Process(5) = 100307
...int Process2...
b2u.Process(4) = 16
...int Process3...
b3u.Process(5) = 100307
有什麼問題嗎?從代碼中絕對不清楚......給出一些細節和解釋,而不僅僅是一段代碼! – 2009-08-17 09:47:06
問題在標題中:「如何在界面中使用不同模板參數兩次使用相同的界面?」 – 2009-08-17 10:45:42
問題是,我們可以嘗試弄清楚爲什麼*你不能這樣做的唯一方法是將代碼複製並粘貼到編譯器中,並嘗試編譯它。你應該發佈你從編譯器得到的錯誤消息,這使得人們更容易回答。永遠不要假設人們會爲了幫助你而跳過許多箍環,幫助我們幫助你,爲我們提供儘可能多的信息。 – 2009-08-17 11:17:14