【发布时间】:2018-11-02 19:41:52
【问题描述】:
我正在使用 C# 并希望在我的类中存储一个类型,但我希望该类型属于某个类或其子类。
这可能是代码的样子:
public class Factory
{
public Type typeToInstantiate where Type: ABaseType;
public Factory(Type instantiateThis where Type : ABaseType)
{
this.typeToInstantiate = instantiateThis;
}
public void DoTheThing()
{
var newObj = (ABaseType)Activator.CreateInstance(typeToInstantiate);
newObj.PrintSomethingToConsole();
}
}
public abstract class ABaseType
{
public abstract void PrintSomethingToConsole();
}
public abstract class ASubType : ABaseType
{
public override void PrintSomethingToConsole()
{
System.Console.WriteLine("Something");
}
}
public abstract class AnotherSubType : ABaseType
{
public override void PrintSomethingToConsole()
{
System.Console.WriteLine("Something else");
}
}
public static void Main(string[] args)
{
List<Factory> factories = new List<Factory>();
factories.Add(new Factory(typeof(AnotherSubType)));
factories.Add(new Factory(typeof(ASubType)));
foreach (var factory in factories) factory.PrintSomethingToConsole();
}
我要解决的问题(如果有人有更好的主意):我正在创建一种工厂,它将实例化一些指定类型的对象。所以,当这个工厂被创建时,它将被创建一个它应该实例化的类型。但是,这个工厂有一个特定的目的,所以它应该只实例化特定类(或该类的子类)的对象。
【问题讨论】:
-
通常使用泛型类型约束来处理...
-
不太清楚你在这里要求什么。似乎您正在描述抽象工厂设计模式,但您不希望工厂是抽象的。你觉得这合适吗?
-
如果你想要一个可以处理任何类型的工厂,你想要
class Factory<T>。如果您想要一个可以处理从给定基类派生的任何类型的类,您需要class Factory<T> where T: BaseClass,按照@Blindy 的解决方案。如果你想在运行时定义这个子类,你的验证只能在运行时进行。 -
看来@Blindy 的解决方案正是你所需要的——你可以在类级别或方法级别使用泛型约束
-
@PaulRJones 你不是在之前的评论中写过这个吗:“当实例化这个工厂时,调用者应该指定它应该创建什么类型。”?调用者如何指定实例化什么类型,同时又不知道工厂应该实例化什么类型?