Заводской метод c # и проблема уровней защиты - PullRequest
0 голосов
/ 23 июня 2011

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

Теперь вот моя проблема: я хочу разрешить ТОЛЬКО инстанцированиеподклассы ОТ фабричного метода.Но если я установлю защищаемые конструкторы подклассов, базовый класс их не увидит.Мне не хватает модификатора доступа, который позволял бы базовому классу вызывать конструкторы подклассов, но не позволял бы другим классам вызывать их?

Internal не выглядит так, как будто он будет работать ...Я хочу ограничить доступ к конструкторам подкласса только базовым классом, в той же сборке есть и другие классы, которые должны иметь возможность доступа к методу базовой фабрики и не создавать экземпляры напрямую ни для одного из подклассов.Надеюсь, что-то очень простое я пропускаю ...

Пример:

public class Base
{
    public Base CreateChild(string childType)
    {
        if(childType == "A")
            return new ChildA();
        if(childType == "B")
            return new ChildB();

        return null;
    }
}

public class ChildA
{
    protected ChildA() // This doesn't work, since now base class can't call this!
    {
    }
}

public class ChildB
{
    protected ChildB()
    {
    }
}

Ответы [ 3 ]

1 голос
/ 23 июня 2011

Вы можете объявить дочерние классы как частные вложенные классы внутри Base

1 голос
/ 23 июня 2011

Вы пытались объявить дочерние классы в базовом классе?

public class Base {
    protected class ChildA {}
    protected class ChildB {}
}
0 голосов
/ 23 июня 2011

Если доступ к любому производному объекту через тип base является допустимым сценарием (скажем, производные только типы переопределяют base реализации и не добавляйте новые функциональные возможности), тогда предлагаемое решение для создания производных типов вложенных private классов (как предлагают предыдущие ответы) является лучшим решением.

Если это не так, то я думаю, что вы попадаете в случай неоправданной сложности. По какой причине код из вашей же сборки не может получить доступ к конструкторам ChildA и ChildB? В конце концов, код, который вы можете контролировать, так что вы всегда можете выбрать / принудительно выполнить с помощью проверки кода, что он инициализируется с помощью фабричного метода.

Я понимаю, что есть веские причины, по которым внешние сборки не могут свободно создавать объекты, за исключением строго контролируемого механизма. В этом случае просто пометьте конструкторы как internal.

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

...