Can*_*ğlu 3 .net c# generics c#-4.0
我知道标题可能令人困惑(甚至误导),但我打算创建一个通用的接口,它应该实现一个涉及泛型参数的方法.
当在类中实现时AFirst,它应该有一个MyMethod<A>()返回类型A 的方法,并且当在类中实现时BFirst,它应该有一个MyMethod<B>()返回类型B 的方法.我需要这个功能,因为A和B之间存在继承关系(和其他许多人一样) )我需要一个可以用任何基类调用的泛型方法.
如果它令人困惑,看看我想做什么:
考虑B派生自A.考虑AFirst和BFirst 分别实现IMyInterface<A>和IMyInterface<B>:
BFirst mySecondObj = new BFirst();
A myA = BFirst.MyMethod<A>();
B myB = BFirst.MyMethod<B>();
Run Code Online (Sandbox Code Playgroud)
我需要访问MyMethod基类的模板,因此当我实例化BFirst实例时,我可以调用MyMethodfor A或B.我正在构建一个模板系统并考虑这些AFirst并且BFirst是模板,并且MyMethod就像工厂方法一样.我将有一个很大的层次结构,项目需要通过从我的基类派生更多的类来扩展A,所以我不能只为每个类创建单独的接口或方法.
我试过这个:
interface IMyInterface<T> where T : A
{
T GetNewInstance<T>();
}
Run Code Online (Sandbox Code Playgroud)
我尝试以这种方式实现,但是当我点击工具时,我正在按照这样的方式创建它:
class AFirst : IMyInterface<A>
{
public T GetNewInstance<T>()
{
throw new NotImplementedException();
}
}
Run Code Online (Sandbox Code Playgroud)
以我指定T类型的方式对我没有意义A,但它仍然实现为T.例如,它会像这样(下面是我希望它发生的方式)
class AFirst : IMyInterface<A>
{
public A GetNewInstance<A>()
{
throw new NotImplementedException();
}
}
class BFirst : AFirst, IMyInterface<B>
{
public B GetNewInstance<B>()
{
throw new NotImplementedException();
}
}
Run Code Online (Sandbox Code Playgroud)
从外部代码中,在我的问题开头调用示例:
BFirst myBFirst = new BFirst();
A a = BFirst.GetNewInstance<A>(); //calls AFirst's method and returns A
B b = BFirst.GetNewInstance<B>(); //calls BFirst's method and returns B
Run Code Online (Sandbox Code Playgroud)
这怎么可能?谢谢,可以.
在通用接口中,您可以定义通用方法.我认为这就是混乱的地方.它应该是返回泛型类型的常规方法.即
interface IMyInterface<T> where T : A
{
T GetNewInstance();
}
Run Code Online (Sandbox Code Playgroud)
这将实现为
class AFirst : IMyInterface<A>
{
public A GetNewInstance()
{
throw new NotImplementedException();
}
}
Run Code Online (Sandbox Code Playgroud)
我猜是你想要的.