是否可以使泛型类的方法对特定类型的行为完全不同?
class MyClass<T> {
public void myMethod(T t) { // Do something }
// something for myMethod(int t) { // DO something special }
}
通过这种方式,我可以拨打(new MyClass<String>()).myMethod(myString)
来执行某项操作,并致电(new MyClass<int>()).myMethod(myInt)
,这会做一些特别的事情。
答案 0 :(得分:4)
我认为你最好只使用重载,而不是泛型。
例如:
public void myMethod(int t)
{
}
public void myMethod(string t)
{
}
你可以在泛型中进行类型检查,但这不是最佳做法。
根据您的编辑和讨论,我相信这就是您想要的:
class Program
{
static void Main(string[] args)
{
IntClass c1 = new IntClass();
c1.MyMethod(12);
BaseClass<string> c2 = new BaseClass<string>();
c2.MyMethod("hello world");
}
}
class BaseClass<T>
{
public virtual void MyMethod(T t)
{
Console.WriteLine(string.Format("Param: {0}", t));
}
}
class IntClass : BaseClass<int>
{
public override void MyMethod(int myVar)
{
Console.WriteLine(string.Format("Param: int"));
}
}
答案 1 :(得分:1)
继续进行并且都有重载,
public void myMethod(T t) { ... }
和
public void myMethod(int t) { ... }
这两种方法都是非泛型的,但是一种方法使用包含类的T
。
如果你构建
MyClass<int>
两种方法的签名将联合。你害怕什么?
电话(new MyClass<int>()).myMethod(42);
进入第二次重载。
我可能误解了你的问题。你只想要一种方法吗?在int
的情况下,您想要做些什么?你可以制作如下代码:
public void myMethod(T t)
{
// do something
if (typeof(T) == typeof(int))
{
// special case
// if you need t as an int, you can use the ugly (int)(object)t
}
}
您还可以考虑为int
案例编写特定的类。该课程可能来自一般课程(您的方法可能是virtual
)。
答案 2 :(得分:0)
只需使用该方法的非泛型重载:
public void myMethod(int t) { // Special case for integer argument }
public void myMethod<T>(T t) { // Generic method for everything else }