2013-02-20 30 views
0

我有一個3類,ParentClass,ClassA,ClassBClassAClassB都是ParentClass的子類。我想嘗試使用某種枚舉類型來創建類型爲ClassAClassB的對象,然後將對象強制實例化爲父類型。我怎樣才能動態地做到這一點?請看下面的代碼,以及說//what do I put here?的部分。謝謝閱讀!如何將枚舉傳遞給父類的靜態函數來實例化子類?

enum ClassType 
{ 
    ClassA, 
    ClassB 
}; 
public abstract class ParentClass 
{ 


    public ParentClass() 
    { 
     //.... 
    } 

    public static ParentClass GetNewObjectOfType(ClassType type) 
    { 
     switch(type) 
     { 
      case ClassType.ClassA: 
       //What do I put here? 
       break; 
      case ClassType.ClassB: 
       //What do I put here? 
       break; 
     } 

     return null; 
    } 
} 

public class ClassA:ParentClass 
{ 
    //.... 
} 
public class ClassB:ParentClass 
{ 
    //....... 
} 
+2

我不知道爲什麼你已成功99%,但不是'新ClassA' /'新ClassB'(你自己的方法名稱暗示已經是解決方案)。 – 2013-02-20 22:14:49

+0

@TimSchmelter我睡了一個小時,意識到我發佈了錯誤的問題。對不起 – 2013-02-20 23:12:39

回答

6

爲什麼不是這樣?

public class ParentClass 
{ 
    public static ParentClass GetNewObjectOfType(ClassType type) 
    { 
     switch(type) 
     { 
      case ClassType.ClassA: 
       return new ClassA(); 
       break; 
      case ClassType.ClassB: 
       return new ClassB(); 
       break; 
     } 

     return null; 
    } 
} 

public class ClassA:ParentClass 
{ 
    //.... 
} 
public class ClassB:ParentClass 
{ 
    //....... 
} 

但是,如果你在你的子類定義默認構造函數,這是很多簡單...

public class ParentClass 
{ 
    private static Dictionary<ClassType, Type> typesToCreate = ... 

    // Generics are cool 
    public static T GetNewObjectOfType<T>() where T : ParentClass 
    { 
     return (T)GetNewObjectOfType(typeof(T)); 
    } 

    // Enums are fine too 
    public static ParentClass GetNewObjectOfType(ClassType type) 
    { 
     return GetNewObjectOfType(typesToCreate[type]); 
    } 

    // Most direct way to do this 
    public static ParentClass GetNewObjectOfType(Type type) 
    { 
     return Activator.CreateInstance(type); 
    } 
} 
+0

它可以通過獲取枚舉值的名稱並使用反射來實例化,從而以更復雜的方式完成,但它回到了此處。爲什麼不是簡單直接的方式?它的表現也更好。 – TheEvilPenguin 2013-02-20 22:14:21

+0

@ TheEvilPenguin是的,我認爲你在想我在想什麼。你可以請看看[這個](http://stackoverflow.com/questions/14991673/c-how-to-pass-an-enum-to-a-parent-classs-static-function-to-instantiate -a-chi) – 2013-02-20 23:14:31

+0

@pswg omg我剛剛意識到你的答案對於這兩個問題都是正確的。謝謝老兄,好東西 – 2013-02-20 23:17:05