Учитывая это:
class D{}
class A<T>{}
class B<T> : A<T> {}
class C : B<D> {}
enum openT
{
level1, level2
}
Я думаю, что вы могли бы искать для этого:
public A<T> FactoryMethod<T>(openT i)
{
if(i == openT.level1)
return new A<T>():
if(i == openT.level2)
return new B<T>():
}
public A<D> FactoryMethod()
{
return new C():
}
public static void Main()
{
A<string> first = OpenFactoryMethod<string>(1);
A<int> second = OpenFactoryMethod<int>(2);
A<D> third = FactoryMethod();
}
Обратите внимание, что не может быть абстрактным, так как вы пытаетесь построить его.
Я не понимаю, что вы на самом деле пытаетесь сделать здесь, поскольку C является закрытым типом, и поэтому ваш заводский метод никогда не будет иметь для этого смысла.
ОБНОВЛЕНО
Следующая может быть ближе к тому, что вы ищете:
public TAofT FactoryMethod<TAofT, T>() where TAofT : A<T>, new()
{
return new TAofT():
}
public static void Main()
{
A<string> first = FactoryMethod<A<string>, string>();
A<int> second = FactoryMethod<B<int>, int>();
A<D> third = FactoryMethod<C, D>();
}
Но фабричный метод, то кажется излишним, так как вы можете просто сделать:
public static void Main()
{
A<string> first = new A<string>();
A<int> second = new B<int>();
A<D> third = new C();
}
ОБНОВЛЕНИЕ 2
Если то, что вы действительно хотите, не так:
public abstract class AEnum<T, T3> where T3 : B<T>, new()
{
private static Func<A<T>> factoryMethod;
public static readonly Level1 = new AEnum<T>(()=>new A<T>());
public static readonly Level2 = new AEnum<T>(()=>new B<T>());
public static readonly Level3 = new AEnum<T>(()=>new T3());
protected AEnum(Func<A<T>> factoryMethod) { this.factoryMethod = factoryMethod; }
public A<T> New() { return this.factoryMethod(); }
}
используется так:
public class DEnum : AEnum<D, C>
{
}
с:
public static void Main()
{
A<D> first = DEnum.Level1.New();
A<D> second = DEnum.Level2.New();
A<D> third = DEnum.Level3.New();
}
Но тогда вы не можете смешивать типы перечислений, так как выше имеет тип, ограниченный до D
.
Или вы могли бы сделать:
public class OpenAEnum<T, T3> : AEnum<T, T3> where T3 : B<T3>
{
}
public class CInt : B<int> {}
public class Cstring : B<string> {}
с:
public static void Main()
{
A<string> first = OpenAEnum<string, CString>.Level1.New();
A<int> second = OpenAEnum<int, CInt>.Level2.New();
A<D> third = OpenAEnum<D, C>.Level3.New();
}
Что это такое, что вы пытаетесь сделать?
Какая ошибка у вас? Что такое 'T'? – SLaks
T - это обычная типовая буква. Однако D - это конкретный класс. – Nex
Что говорит ошибка компиляции? Вы не можете просто поставить 'T' там, если это не означает что-то в этой области. – 31eee384