我知道标题可能令人困惑(甚至误导),但我打算创建一个通用的接口,它应该实现一个涉及泛型参数的方法。
在类AFirst
中实现时,它应该有一个返回类型A的方法MyMethod<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>();
我需要访问基类的MyMethod
模板,因此当我实例化BFirst
实例时,我可以为MyMethod
或{{A
调用B
1}}。我正在构建一个模板系统,并认为这些AFirst
和BFirst
是模板,MyMethod
就像工厂方法一样。我将有一个很大的层次结构,项目需要通过从我的基类A
派生更多类来扩展,所以我不能只为每个类创建单独的接口或方法。
我试过了:
interface IMyInterface<T> where T : A
{
T GetNewInstance<T>();
}
我尝试以这种方式实现,但是当我点击工具时,我就像这样创建了它:
class AFirst : IMyInterface<A>
{
public T GetNewInstance<T>()
{
throw new NotImplementedException();
}
}
对我来说没有意义,因为我已经将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();
}
}
从外部代码中,按照我的问题开头调用示例:
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
这怎么可能? 谢谢, 可以。
答案 0 :(得分:9)
在通用界面中,您可以定义通用方法。我认为这就是混乱的地方。它应该是返回泛型类型的常规方法。即。
interface IMyInterface<T> where T : A
{
T GetNewInstance();
}
这将实现为
class AFirst : IMyInterface<A>
{
public A GetNewInstance()
{
throw new NotImplementedException();
}
}
我猜是你想要的。
答案 1 :(得分:1)
你可能过于复杂了。你可以考虑Template pattern。基类是抽象的,并定义了一个可覆盖的方法。继承自此基类的类然后提供此方法的实现。
您仍然可以使用泛型和界面,但这种模式可能是您需要开始的基础。
修改强>
public abstract class ABase<T>
{
public abstract T MyMethod();
}
public class A : ABase<A>
{
public override A MyMethod()
{
throw new NotImplementedException();
}
}
public class B : A
{
}
要实现一个接口,这将是
public interface IHasMethod<T>
{
T MyMethod();
}
public abstract class ABase<T> : IHasMethod<T> ...