Я знаю, что заголовок может вводить в заблуждение (или даже вводить в заблуждение), но я планирую создать универсальный интерфейс, и в нем должен быть реализован метод с использованием универсального параметра.
При реализации в классе 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>();
Мне нужен доступ к шаблонам MyMethod
для базовых классов, поэтому, когда я создаю экземпляр экземпляра BFirst
, я могу вызвать либо MyMethod
для A
, либо B
. Я строю систему шаблонов и думаю, что 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
Как это возможно?
Спасибо,
Может.