解決方案1
您可以通過使用通用接口來解決此問題。該接口將由您的幫助程序(createGenericClass
)類實例使用,並且您的其他接口也將使用您希望傳遞的接口。我們稱之爲IBaseService
。
public class createGenericClass<T>
where T : IBaseService // telling T can be only IBaseService and inherited stuff.
{
public void CallDoSomeThing(T t, int x, int y)
{
(t as IWebService)?.DoSomeThing(x, y); // casting and validating
}
public void CallDoSomeThingElse(T t, int a, float b)
{
(t as IVoiceService)?.DoSomeThingElse(a, b); // casting and validating
}
}
public interface IBaseService{} // only gives a common parent to other interfaces. Common properties, methods can be included here.
public interface IWebService : IBaseService // inheriting the common interface
{
void DoSomeThing(int x, int y);
}
public interface IVoiceService : IBaseService // inheriting the common interface
{
void DoSomeThingElse(int a, float b);
}
所以,你可以實例化助手類是這樣的:
class Program
{
static void Main(string[] args)
{
var obj = new createGenericClass<IBaseService>();
obj.CallDoSomeThing(new Web_Service(), 1, 2); // works well
obj.CallDoSomeThingElse(new Voice_Service(), 3, 4); // works well
}
}
注:也有幾個步驟,你可以用它來簡化你的使用輔助類,如做沒有泛型的輔助類static(也許是Singleton),僅在方法上使用泛型。這樣你就不需要實例化類。
然而,這些「簡化」修改性能和可用性將取決於你的目標,在使用的情況下,對數據和其他管理類您正在使用等工作..
解決方案2 - (你的任務可以在沒有泛型的情況下解決)
你說你不想轉換收到的實例。既然你想在這些實例上調用不同的方法,你可以通過在你的helper類上調用不同的方法來調用它們。在這種情況下,你並不需要泛型。
這將完成這項工作,而不使用IBaseService
甚至泛型。
public class createGenericClass
{
public void CallDoSomeThing(IWebService t, int x, int y)
{
t.DoSomeThing(x, y);
}
public void CallDoSomeThingElse(IVoiceService t, int a, float b)
{
t.DoSomeThingElse(a, b);
}
}
解決方案3 - (雙 - 通用的東西,這是不建議在這裏)
既然你問它:
public class createGenericClass<T, V>
where T: IWebService
where V: IVoiceService
{
public void CallDoSomeThing(T t, int x, int y)
{
t.DoSomeThing(x, y);
}
public void CallDoSomeThingElse(V t, int a, float b)
{
t.DoSomeThingElse(a, b);
}
}
用法:
static void Main(string[] args)
{
var obj = new createGenericClass<IWebService, IVoiceService>();
obj.CallDoSomeThing(new Web_Service(), 1, 2);
obj.CallDoSomeThingElse(new Voice_Service(), 3, 4);
}
」不行「,你能告訴我們會發生什麼嗎?如果編譯器抱怨,你需要告訴我們實際的編譯器錯誤。 –