2013-09-24 82 views
-1

我想知道是否有辦法讓ManagerClass調用不同類的構造函數,它們共享相同的接口並繼承相同的基類。我無法自己調用特定的派生類構造函數,因爲用戶可以選擇在運行時創建哪些對象,因此我不知道要在運行時創建哪些派生對象。調用不同類的構造函數實現相同的接口,並從相同的基礎派生?

例如:

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

的derivedClasses的運行構造函數或創建基本上是新派生的對象,通過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,但如果這有助於我做我想做的事情,我不是aga進行這種改變。

+0

你希望你的經理類來創建根據用戶輸入不同的具體類的實例? –

+0

是的,這可能嗎? – user1084113

+0

查看抽象工廠模式,看看是否適合您的用例。 –

回答

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; 
} 
+0

我不想這樣做,因爲那麼設計是不可擴展的,如果開發人員要創建另一個派生類,他們也將被要求添加這個'if條件'。目前,ManagerClass存儲實現ISomeInterface並調用其doSmthg方法的所有對象,因此如果開發人員要創建另一個derivedClass,則只需實現該方法並從BaseClass繼承。 – user1084113

+1

你的狀況如何?用戶是否只傳遞了要創建的實現名稱? –

+1

@ user1084113您應該編輯您的問題以包含許多派生類存在的信息,並且稍後可能需要添加更多派生類。你也應該寫一些關於如何確定在每個特定情況下使用的派生類。在處理僅僅'derivedClass'和'derivedClass2'時,我可能會誤解你的問題。 –

0

如果你希望開發者所要做的就是創建類和你的經理都能自動創建它的實例,使用反射來收集的選項列表呈現給用戶,並在請求時使用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); 
} 
相關問題