첫째, 나는이 질문의 제목을 붙이기 위해 고심 했으므로 더 나은 아이디어가 있다고 생각한다면 먼저 편집하십시오.비 제너릭 클래스에 제네릭 생성
이것은 내가 몇 번이고 뛰어 다니며 우회하는 악취를내는 것으로 끝나는 문제인 것 같습니다. 일반적인 형식은 무언가 (예 : 팩토리)의 인스턴스를 가져 오기위한 비 제너릭 클래스가 있지만 인스턴스의 유형에 대한 결정이 필요하다는 것입니다. 아래 예제에서는 내가 무엇을 설명하는지 보여 주지만, 컴파일되지 않는다는 것을 알게 될 것입니다. 왜냐하면 FooBarFactory
에서 AbstractThing
을 T
으로 사용할 수 없기 때문에 추상화는 허용되지 않기 때문입니다. 그렇다면 어떻게하면 FooBarFactory
을 런타임에 Generator<T>
이 T에 사용해야하는 유형으로 결정하게 할 수 있습니까?
public class FooBarFactory
{
private Generator<AbstractThing> _generator;
public AbstractThing GetThing(string data, ThingType type)
{
switch (type)
{
case ThingType.Foo:
_generator = new FooGenerator();
break;
case ThingType.Bar:
_generator = new BarGenerator();
break;
case ThingType.None:
return null;
default:
throw new ArgumentOutOfRangeException(nameof(type), type, null);
}
return _generator.Generate(data);
}
}
public abstract class Generator<T> where T : AbstractThing, new()
{
protected T GeneratedThing = new T();
protected abstract void MapDataToThing(string data);
public T Generate(string data)
{
MapDataToThing(data);
return GeneratedThing;
}
}
public class FooGenerator : Generator<Foo>
{
protected override void MapDataToThing(string data)
{
GeneratedThing.AbstractProp = ParseAbstract(data);
GeneratedThing.FooProp = ParseFoo(data);
}
private static string ParseAbstract(string data)
{
throw new NotImplementedException();
}
private static string ParseFoo(string data)
{
throw new NotImplementedException();
}
}
public class BarGenerator : Generator<Bar>
{
protected override void MapDataToThing(string data)
{
GeneratedThing.AbstractProp = "Base property in Bar";
GeneratedThing.BarProp = data.Substring(4, 3);
}
}
public abstract class AbstractThing
{
public string AbstractProp { get; set; }
}
public class Foo : AbstractThing
{
public string FooProp { get; set; }
}
public class Bar : AbstractThing
{
public string BarProp { get; set; }
}
public enum ThingType
{
None = 0,
Foo = 1,
Bar = 2
}
제네릭의 주 목적은 * 컴파일 타임 * 유형 안전을 제공하는 것입니다. "FooBarFactory가 Generator이 T에 사용해야하는 유형을 런타임에 결정하게하십시오."는 의미가 없습니다. –
mm8
@ mm8 - 내 의도는 공장에서 AbstractThing을 반환하도록하는 것이 었습니다. 여기서 무엇을 권하고 싶습니까? 공장에는 AbstractThing의 각 하위 유형에 대한 메소드가 있어야합니까? 또는 공장에 Generator의 인스턴스가 없어야하며 대신 각 사례 블록 내에 적절한 Generator를 새로 작성해야할까요? – bubbleking
일반 생성기가 필요하지 않습니다. 나는 대답을 올렸다. – mm8