Можно ли сделать тип "герметичный, кроме внутренних типов"

Я хочу создать тип, который может наследоваться от типов в той же сборке, но не может наследоваться извне сборки. Я хочу, чтобы тип был виден за пределами сборки.

Это возможно?

2 ответа

Решение

Вы можете сделать конструктор внутренним:

public class MyClass
{
    internal MyClass() { }
}

Каждый класс, производный от базового класса, должен вызывать конструктор базового класса в своем конструкторе. Поскольку он не может вызвать конструктор, если базовый класс находится в другой сборке, производный класс не компилируется.

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

Не поймите меня неправильно: ответ ДТБ хороший. Внутренний конструктор является наиболее близким к желаемому результату.

Тем не менее, я думаю, что любой, кто читает это, должен знать, что в этом примере MyClass не был бы описан как запечатанный во время выполнения. Маловероятно, что это когда-либо будет проблемой, но может привести к тому, что логика, основанная на рефлексии (из вашего кода или сторонней библиотеки), будет действовать по-другому на этот конкретный тип. Это то, что нужно иметь в виду.

А теперь, чтобы еще больше расширить пример кода dtb:

public class MyClass
{
    internal MyClass() { }

    // This factory method will be accessible from external assemblies, making your class instantiable yet still "sealed"
    public static MyClass Create()
    {
        return new MyClass();
    }
}

Таким образом, вы все еще можете создавать экземпляры MyClass извне владеющего собранием, сохраняя при этом контроль над наследованием.

Другие вопросы по тегам