-1

我想知道是否有一种方法可以让 ManagerClass 调用共享相同接口并从相同基类继承的不同类的构造函数。我不能自己调用​​特定的派生类构造函数,因为用户可以选择在运行时创建哪些对象,因此直到运行时我才知道要创建哪些派生对象。

例如:

public class managerClass : ISomeInterface
{
   public BaseClass apply(someDataType) //(Notice return type is BaseClass) 
   {

运行派生类的构造函数或创建本质上新的派生对象,将 someDataType 传递给构造函数

   } 
}

public class derivedClass : BaseClass, ISomeInterface
{
   public void doSmthg(){manipulate data and store}
}
public class derivedClass2 : BaseClass, ISomeInterface
{
   public void doSmthg(){manipulate data in another way and store}
}

目前 managerClass 不从同一个 BaseClass 继承,但是如果这有助于让我做我想做的事,我不反对做出这个改变。

4

3 回答 3

0

如果您希望开发人员所要做的只是创建类,并且您的经理将能够自动创建它的实例,请使用 Reflection 收集提供给用户的选项列表,并使用 Activator 创建实例请求。

Dictionary<string, Type> DerivedOfferings{get;set;}

... //somewhere in the setup of your manager.

foreach (Type t in AppDomain.CurrentDomain.GetAssemblies().SelectMany(a => a.GetTypes().Where(t => t.GetInterfaces().Contains(typeof(IEmtRequestProcessor)))))
{
    DerivedOfferings.Add(t.Name, t);
}

//provide list of options to users.
IList<string> GetOfferingOptions(){
    return DerivedOfferings.Keys.ToList();
}

...

public BaseClass GetOffering(string name){
    return (BaseClass)Activator.CreateInstance(DerivedOfferings[type]);
}

如果需要执行一些逻辑来决定创建哪个派生产品,您可以为开发人员提供一个属性来装饰他们的类,使用该属性来保存执行逻辑所针对的信息。

public sealed class CreatureAttribute:Attribute
{
    public int NumberOfLegs{get;set;}
    public Color HairColor{get;set;}
    public int NumberOfWings{get;set;}
    public bool BreathsFire{get;set;}
}

[CreatureAttribute(NumberOfLegs=6, HairColor = Color.Magenta, NumberOfWings=0, BreathsFire=True)]
public class PurpleDragon: ICreature
{
...
}

然后在枚举期间检索这些并将它们与选项一起存储。

List<CreatureCriteria> CreatureOptions{get;set;}
EnumerateOptions()
{
    foreach (Type t in AppDomain.CurrentDomain.GetAssemblies().SelectMany(a => a.GetTypes().Where(t => t.GetInterfaces().Contains(typeof(ICreature)))))
    {
        foreach (CreatureAttribute creatureAttribute in
                t.GetCustomAttributes(typeof (CreatureAttribute), false)
                .Cast<CreatureAttribute>()                    
            {
                CreatureOptions.Add(
                    new CreatureCriteria{
                            Legs = creatureAttribute.NumberOfLegs,
                            HairColor = creatureAttribute.HairColor,
                            ...
                            ConcreteType = t
                     }
                );
            }
    }
}

并根据用户提供的标准进行评估..

ICreature CreateCreature(CreatureCriteria criteria){
    CreatureCriteria bestMatch = CreatureOptions.FindBestMatch(criteria);
    // perform logic comparing provided criteria against CreatureOptions to find best match.
    return (ICreature)Activator.CreateInstance(bestMatch.ConcreteType);
}
于 2013-09-24T15:36:41.633 回答
0

你可以看看这个Activator类:

Type type = typeof(derivedClass2);
ISomeInterface instance = (ISomeInterface)Activator.Create(type);

还有一些重载,比如传递类名而不是类型。

更多信息:http: //msdn.microsoft.com/en-us/library/system.activator.aspx

否则你应该看看Factory Design Pattern这里http://msdn.microsoft.com/en-us/library/ee817667.aspx

于 2013-09-24T14:41:57.373 回答
0

你有什么问题?你当然可以说:

public BaseClass Apply(SomeDataType someDataType)
{
  BaseClass instance;
  if (/* your condition */)
  {
    var dc = new DerivedClass();
    // do stuff to/with dc
    instance = dc;
  }
  else
  {
    var dc2 = new DerivedClass2();
    // do stuff to/with dc2
    instance = dc2;
  }
  // do common stuff to/with instance
  return instance;
}
于 2013-09-24T14:43:15.920 回答