我想你可以得到C#中的接近將是:
class GenericPrinter<T>
{
public virtual void Print()
{
Console.WriteLine("Unspecialized method");
}
}
class IntPrinter : GenericPrinter<int>
{
public override void Print()
{
Console.WriteLine("Specialized with int");
}
}
否則,答案是,你不能專注於C#。
由於Lyubomyr Shaydariv在他的評論中說:
C++模板不是.NET泛型。你不能。
從您的編輯我猜你將有一些類型的檢查,以。
你可以用字典來做這個例子。
class GenericPrinter<T>
{
private Dictionary<Type, Action> _actions
= new Dictionary<Type, Action>()
{
{ typeof(int), PrintInt }
};
public virtual void Print()
{
foreach (var pair in _actions)
if (pair.First == typeof(T))
{
pair.Second();
return ;
}
Console.WriteLine("Unspecialized method");
}
public virtual void PrintInt()
{
Console.WriteLine("Specialized with int");
}
}
就像你可以看到的,你將不得不爲每種類型做一個方法,你想要處理。當你試圖將T操作爲int時,你也可能遇到一些問題。因爲T
確實是通用的(它沒有任何約束),所以它更有可能在代碼中運行爲object
(不是在運行時),您將不得不在您的方法中將其轉換爲(int)(object)yourTVariable
,在那裏您確定T
是int
。
但是對於這個部分,我想我的一些同齡人會比我給你一個更好的答案。
如果它只是顯示哪種類型使用的是:
public virtual void Print()
{
Console.WriteLine($"Specialized with {typeof(T).Name}");
}
但你不會有非特消息了(如果你仔細想想,你不能有一個GenericPrinter沒有指定其類型實例化。然後,它是沒有意義的有一個顯示「非專業化」的方法,你將永遠有一個指定類型)
無論如何,答案還是一樣,你不能專門在C#中使用泛型。
C++模板不是.NET泛型。你不能。 –
下面是一個很好的解釋,甚至解釋了Java泛型的差異:http://stackoverflow.com/questions/31693/what-are-the-differences-between-generics-in-c-sharp-and-java-和 - 模板 - 我。 –
你不能。你需要找到其他方式來處理這種情況。 –