Выберите класс для создания экземпляра c # - PullRequest
3 голосов
/ 20 января 2009

что я хочу сделать, это выбрать соответствующий класс для создания экземпляра на основе переданных скобок. В настоящее время у меня есть два класса (ClassA и ClassB), и для вызова их я использую 2 метода в зависимости от круглых скобок. Какие я хотел бы достичь, это использовать только один метод для создания экземпляров ClassA или ClassB на основе пропущенных скобок строки.

Я действительно не знаю, как я могу передать объект класса для использования ..

Мой старый способ был в методе 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;
}

Любые предложения, как я могу решить эту, вероятно, очень легкую ситуацию.

Ответы [ 4 ]

12 голосов
/ 20 января 2009

Вам нужен фабричный метод в базовом классе:

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
{
}

Дополнительную информацию можно найти в статье Википедии о шаблоне фабричного метода .

4 голосов
/ 20 января 2009

Я бы использовал общий интерфейс для ваших классов и отдельный класс фабрики с общим методом фабрики следующим образом:

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");
    }
}
4 голосов
/ 20 января 2009

То, что вы хотите сделать, обычно не считается очень полезной операцией. Когда вы закончите, все, что вы знаете о результате, это то, что это объект. Вы не знаете ни о каких методах или свойствах, которые он предоставляет. Поскольку C # не позволяет (в ближайшее время появится в v4) позднее связывание, вы ничего не можете сделать с результатом.

Становится гораздо интереснее, когда класс A и класс B реализуют общий интерфейс или наследуются от общего базового класса. В этом случае у вас может быть универсальный метод, который создает экземпляр вашего реального класса, но возвращает его как общий интерфейс. Это гораздо полезнее, например, для архитектуры плагинов.

2 голосов
/ 20 января 2009

Для этого лучше использовать шаблон проектирования. Взгляните на шаблоны «Абстрактная фабрика и фабричный метод» на веб-сайте «Банды четырех».

Абстрактная фабрика

Заводской метод

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...