Может ли конструктор вернуть подкласс? - PullRequest
8 голосов
/ 28 февраля 2010

С учетом следующего кода клиента:

var obj = new Class1();

Есть ли способ изменить конструктор Class1 так, чтобы он вместо этого фактически возвращал подкласс (или некоторую другую альтернативную реализацию)?

Я бы хотел, чтобы obj получил одну из двух разных реализаций, в зависимости от некоторых условий. Очевидно, что я мог бы перейти на использование фабричной или DI-инфраструктуры, но я бы хотел, по возможности, избежать изменения клиентского кода.

Я предполагаю, что ответ - нет, но мне интересно, есть ли какой-нибудь умный способ сделать это.

Ответы [ 4 ]

9 голосов
/ 28 февраля 2010

Вы можете заменить конструктор заводским методом и вернуть все, что захотите, в зависимости от параметров:

public Class2 : Class1 {}

public static Class1 CreateClass1(bool returnDerivedClass)
{
    if (returnDerivedClass)
    {
        return new Class2();
    }
    else
    {
        return new Class1();
    }
}
4 голосов
/ 28 февраля 2010

Это невозможно.

Умные обходные пути включают замену конструктора функцией static или (не рекомендуется) использование обертки вокруг базового класса и создание различных обернутых классов.

0 голосов
/ 27 августа 2014

Используйте библиотеку инъекций. Ссылка ниже представляет большой список библиотек инъекций и сравнение их производительности

http://www.palmmedia.de/blog/2011/8/30/ioc-container-benchmark-performance-comparison

Однако я хотел бы предположить, что производительность редко является критерием, по которому вы бы выбрали библиотеку инъекций, большинство приложений не будет создавать экземпляры количества объектов, которые этот парень использовал в своих тестах. Я использую NInject, который хорошо выполняет свою работу, однако, если бы я начал другой проект, я бы, вероятно, дал бы simpleinjector , он, кажется, имеет все функции, которые я использую в NInject, и он хорошо работает в сравнение производительности.

0 голосов
/ 28 февраля 2010

Для таких вещей вы хотите проверить шаблон Factory. Кроме того, в зависимости от ваших потребностей, я бы порекомендовал рассмотреть общие методы уменьшения сцепления. Ваш вызов конструктора класса является самым сложным соединением, которое вы можете иметь в программе, и делает такие вещи, как свопирование реализации, хлопотами, как вы сами поняли.

Прочтите о «Инверсии контроля» и «Инъекции зависимостей», возможно, это то, что вы действительно ищете.

Хорошую библиотеку можно найти здесь .

...