2009-01-20 46 views
2

我想要做的是根據傳入的括號選擇合適的類來實例化。 目前我所擁有的是兩個類(ClassA和ClassB),並使用2個方法調用這些im,具體取決於括號。我想實現的 只是使用一種方法來基於傳遞的字符串括號實例化ClassA或ClassB。選擇要實例化的類c#

我真的不知道我可以傳回類對象使用..

我的老辦法是在方法A調用類的實例,然後我可以使用它。 ClassA myclass = new ClassA();

我沒有考慮使用以下內容,但我不知道如果我實例化對象o或者在MyMethod傳回時使用它。 對象o犯規似乎給我訪問到A級或B級

public class ClassA 
{ 
    public ClassA() 
    { 
     //Do something for Class A 
    } 
    public string msgA() 
    { 
     return "Here is msg A"; 
    } 
} 

public class ClassB 
{ 
    public ClassB() 
    { 
     //Do something for Class B 
    } 
    public string msgB() 
    { 
     return "Here is msg B"; 
    } 
} 

private string MyMethod() 
{ 
    object o = GetClassToInstantiate("ClassA"); 
    //Use object o 
} 

private object GetClassToInstantiate(string parameter) 
{ 
    object temp = null; 
    switch (parameter) 
    { 
     case "ClassA": 
      temp = new ClassA(); 
      break; 
    } 

    return temp; 
} 

任何建議市民字符串方法如何,我可以解決這個可能很容易的情況。

+0

那麼,根據你傳遞的字符串參數當前的代碼確實是返回一個對象英寸我不清楚你想做什麼,它還沒有做。 – 2009-01-20 16:09:59

+0

你從商業角度試圖做什麼? – mson 2009-01-20 16:15:54

+0

我認爲OP很可能就在學習曲線中的那一點,而界面和泛型還不在武器庫中。有了這些和工廠方法,這個問題就消失了。希望AdamRalph的回答能夠得到更多讚揚,因爲它是現貨。 – 2009-01-20 16:36:17

回答

11

你需要的是一個基類工廠方法:

enum ClassType { ClassA, ClassB } 

class ClassBase 
{ 
    public static ClassBase Create(ClassType classType) 
    { 
     switch (classType) 
     { 
      case ClassType.ClassA: return new ClassA(); 
      case ClassType.ClassB: return new ClassB(); 
      default: throw new ArgumentOutOfRangeException(); 
     } 
    } 
} 

class ClassA : ClassBase 
{ 
} 

class ClassB : ClassBase 
{ 
} 

檢查的Factory method pattern維基百科的文章以獲得更多信息。

4

你想要做的不是一般被認爲是非常有用的操作是什麼。當你完成所有你知道的結果是它是一個對象。你不知道它提供的任何方法或屬性。由於C#沒有(現在即將在第4版中發佈)允許後期綁定,所以你不能對結果做任何事情。

當A類和B類實現通用接口或從公共基類繼承時,它變得更有趣。在這種情況下,你可以有一個通用的方法來實例化你的真實類,但是將它作爲通用接口返回。這比插件架構更有用。

4

如下我會用你的類的通用接口和一個單獨的工廠類與一般的工廠方法: -

class Program 
{ 
    static void Main(string[] args) 
    { 
     IAnimal animal = AnimalFactory.CreateAnimal<Dog>(); 

     animal.Speak(); 

     Console.ReadKey(); 
    } 
} 

public abstract class AnimalFactory 
{ 
    public static IAnimal CreateAnimal<T>() where T : IAnimal, new() 
    { 
     return new T(); 
    } 
} 

public interface IAnimal 
{ 
    void Speak(); 
} 

public class Dog : IAnimal 
{ 
    public void Speak() 
    { 
     Console.WriteLine("Woof"); 
    } 
} 

public class Cat : IAnimal 
{ 
    public void Speak() 
    { 
     Console.WriteLine("Meow"); 
    } 
}