是否可以在C#中进行以下专业化?我可以用C ++做到这一点,但不了解如何在C#中实现相同的结果。
class GenericPrinter<T>
{
public void Print()
{
Console.WriteLine("Unspecialized method");
}
}
class GenericPrinter<int>
{
public void Print()
{
Console.WriteLine("Specialized with int");
}
}
添加了:
建议GenericPrinterInt
解决方案的问题是我需要明确创建它。 new GenericPrinter<int>
仍会打印Unspecialized method
。
我想要的是使用来自另一个泛型类的GenericPrinter,而knoledge的T等于int或其他东西。
答案 0 :(得分:7)
我猜你在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
(不是在运行时),你必须像{{1}那样强制转换它在您的方法中,您确定(int)(object)yourTVariable
是T
。
但对于这一部分,我想我的一些同行,会得到比我更好的答案给你。
如果只是显示您正在使用的类型:
int
但是你不会再有非特殊化的消息了(如果你想一想,你就不能在没有指定类型的情况下实例化GenericPrinter。那么有一个显示“unspecialized”的方法是没有意义的,< strong>您将始终拥有指定的类型)
无论如何,答案仍然是相同的,你不能专门研究C#中的泛型。
答案 1 :(得分:3)
在C#中是不可能的 您可以改用继承:
class GenericPrinter<T>
{
public virtual void Print()
{
Console.WriteLine("Unspecialized method");
}
}
class GenericPrinterInt : GenericPrinter<int>
{
public override void Print()
{
Console.WriteLine("Specialized with int");
}
}
根据更新的问题,我只能建议您采用以下方法。您可以创建一个静态工厂方法,在该方法中可以检查T
的类型,并在类型符合条件时实例化相应的专用类:
class GenericPrinter<T>
{
public static GenericPrinter<T> Create()
{
if (typeof(int).IsAssignableFrom(typeof(T)))
return (GenericPrinter<T>)(object)new GenericPrinterInt();
if (typeof(double).IsAssignableFrom(typeof(T)))
return (GenericPrinter<T>)(object)new GenericPrinterDouble();
// Other types to check ...
return new GenericPrinter<T>();
}
public virtual void Print()
{
Console.WriteLine("Unspecialized method");
}
}
class GenericPrinterInt : GenericPrinter<int>
{
public override void Print()
{
Console.WriteLine("Specialized with int");
}
}
class GenericPrinterDouble : GenericPrinter<double>
{
public override void Print()
{
Console.WriteLine("Specialized with double");
}
}
其他一些通用类:
class SomeGenericClass<T>
{
public readonly GenericPrinter<T> Printer = GenericPrinter<T>.Create();
}
使用示例:
var intClass = new SomeGenericClass<int>();
intClass.Printer.Print();
// Output: Specialized with int
var doubleClass = new SomeGenericClass<double>();
doubleClass.Printer.Print();
// Output: Specialized with double
var stringClass = new SomeGenericClass<string>();
stringClass.Printer.Print();
// Output: Unspecialized method