Можно ли сделать тип "герметичный, кроме внутренних типов"
Я хочу создать тип, который может наследоваться от типов в той же сборке, но не может наследоваться извне сборки. Я хочу, чтобы тип был виден за пределами сборки.
Это возможно?
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
извне владеющего собранием, сохраняя при этом контроль над наследованием.