在C#中是否可以在基类中定义泛型方法,然后根据子类调用它来定义类型。
abstract class BaseClass
{
void SomeMethod<T>()
{
...
}
}
class SubClass1 : BaseClass
{
...
}
class SubClass2 : BaseClass
{
...
}
现在,如果我从SubClass1的一个实例调用SomeMethod,我希望它使用一种类型(让我们说是字符串),如果我从SubClass2的实例调用它,我希望它使用不同的类型(让&# 39; s说int)。所以......
BaseClass instance1 = new SubClass1();
BaseClass instance2 = new SubClass2();
instance1.SomeMethod() //this should call SomeMethod<string>()
instance2.SomeMethod() //this should call SomeMethod<int>()
这可能吗?
我想为一个BaseClass变量分配一个SubClass1或SubClass2的实例:
for (int i = 0; i < numSubClasses; i++)
{
BaseClass variable = GetNextSubClass(); //On first iteration GetNextSublass returns an instance of SubClass1 and on second iteration it returns an instance of SubClass2
variable.SomeMethod();
}
我想在基类中使用泛型实现的原因是因为除了类型
之外,两个子类的实现完全相同答案 0 :(得分:3)
将泛型类型添加到Base类:
abstract class BaseClass<T>
{
void SomeMethod<T>()
{
...
}
}
class SubClass1 : BaseClass<string>
{
...
}
class SubClass2 : BaseClass<int>
{
...
}
上面的代码有点无意义,因为我们没有使用泛型类型。
abstract class BaseClass<T>
{
public T SomeMethod<T>(T aParam)
{
...
return aParam;
}
}
class SubClass1 : BaseClass<string>
{
...
}
class SubClass2 : BaseClass<int>
{
...
}
提供一些更具体的例子来说明你想要实现的目标。
答案 1 :(得分:0)
看起来你想使用通用接口:
using System;
class Program
{
interface IBase<T>
{
void SomeMethod();
}
class SubClass1 : IBase<string>
{
public void SomeMethod()
{
Console.WriteLine("I write string!");
}
}
class SubClass2 : IBase<int>
{
public void SomeMethod()
{
Console.WriteLine("I write int!");
}
}
static void Main(string[] args)
{
IBase<string> instance1 = new SubClass1();
IBase<int> instance2 = new SubClass2();
instance1.SomeMethod(); //this should call SomeMethod<string>()
instance2.SomeMethod(); //this should call SomeMethod<int>()
Console.ReadLine();
}
}
事实上,你甚至不需要2节课。您可以使用单个泛型类来实现相同的效果:
using System;
class Program
{
interface IBase
{
void SomeMethod();
}
class SubClass<T> : IBase
{
public void SomeMethod()
{
Console.WriteLine("I write {0}", typeof(T));
}
}
static void Main(string[] args)
{
IBase instance1 = new SubClass<string>();
IBase instance2 = new SubClass<int>();
instance1.SomeMethod(); //this should call SomeMethod<string>()
instance2.SomeMethod(); //this should call SomeMethod<int>()
Console.ReadLine();
}
}