Как я могу контролировать тип объекта, созданного на основе аргументов конструктора? - PullRequest
0 голосов
/ 16 марта 2020

Итак, у меня есть эта настройка

namespace SomeNamespace
{
    public class SomeChildClass : SomeParentClass
    {

        ClassObject object;

        SomeChildClass(Object1 object1, etc)
        { object = object1 }
        SomeChildClass(Object2 object2, etc)
        { object = object2 } 

        method1()
        {
            object.doSomething();
        }
        .
        .
        .
        methodN()
        {
            object.doSomething();
        }
    }
}

Итак, есть много методов 1 - N, которые используют object.DoSomething (), и я хотел бы найти решение, чтобы они остались прежними. Итак, есть ли способ, которым я мог бы определить ClassObject как Object1 или Object2 вне конструкторов, чтобы он позволял мне не трогать мои методы?

Ответы [ 3 ]

0 голосов
/ 16 марта 2020

Если вы не можете использовать обычный полиморфизм и наследование (которое требует владения всеми типами для установки), у вас есть два варианта:

  • диспетчеризировать динамически (используя dynamic вместо ClassObject)
  • или создайте два класса-оболочки, которые адаптируют Object1 и Object2 к общему интерфейсу
0 голосов
/ 16 марта 2020

То, что вы ищете, это Abstract Factory шаблон проектирования. Что вам нужно сделать, это: создать базовый класс для ваших классов объектов: public abstract class BaseClass { }

Затем извлечь классы, которые вы хотите создать из базового класса, при перемещении общих атрибутов в базовый класс:

public class DerivedClassA : BaseClass { }
public class DerivedClassB : BaseClass { }

Теперь создайте абстрактный фабричный класс, который принимает аргумент, а затем выбирает класс на его основе:

public static class AbstractFactory 
{
    public static BaseClass Create(string arg)
    {
        switch (arg)
        {
            case "A":
                return new DerivedClassA();
            case "B":
                return new DerivedClassB();
            default:
                throw new ArgumentException(nameof(arg));
         }
    }
}

Все это работает благодаря полиморфизму. Полиморфизм и абстрактный дизайн фабрики являются широко известными концепциями, поэтому вы можете легко найти больше информации о них в Интернете.

0 голосов
/ 16 марта 2020

Если Object1 и Object2 наследуются от ClassObject, то вы можете использовать полиморфизм и принять ClassObject в конструкторе.

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