选择要实例化c#的类

时间:2009-01-20 16:06:40

标签: c# design-patterns

我想要做的是选择适当的类来实例化基于传入的括号。 目前,我有两个类(ClassA和ClassB),并根据括号使用2种方法调用这些im。什么 我想实现的是只使用一种方法基于传递的字符串括号实例化ClassA或ClassB。

我真的不知道如何传回类对象来使用..

我的方法是在方法A中调用类来实例化然后我可以使用它。 ClassA myclass = new ClassA();

我确实考虑过使用以下内容,但我不知道(如果我很诚实)知道如何实例化对象o或在MyMethod传回时使用它。 object 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;
}

任何建议我如何解决这个可能非常容易的情况。

4 个答案:

答案 0 :(得分:12)

您需要的是基类中的工厂方法:

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上的维基百科文章了解更多信息。

答案 1 :(得分:4)

您想要做的事情通常不被视为非常有用的操作。当你完成所有你知道的结果是它是一个对象。您不知道它提供的任何方法或属性。由于C#没有(目前很快将在v4中)允许后期绑定,因此你无法对结果做任何事情。

当A类和B类实现公共接口或从公共基类继承时,它变得更加有趣。在这种情况下,您可以使用一个通用方法来实例化您的真实类,但将其作为公共接口返回。这更有用,例如使用插件架构。

答案 2 :(得分: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");
    }
}

答案 3 :(得分:2)

最好使用设计模式来完成此操作。在Gang of Four网站上查看抽象工厂和工厂方法模式。

Abstract Factory

Factory Method