Можно ли создать базовый класс С#, доступный только в сборке библиотеки, в который он скомпилирован, в то время как другие подклассы, которые наследуют его публично?
Например:
using System.IO;
class BaseOutput: Stream // Hidden base class
{
protected BaseOutput(Stream o)
{ ... }
...lots of common methods...
}
public class MyOutput: BaseOutput // Public subclass
{
public BaseOutput(Stream o):
base(o)
{ ... }
public override int Write(int b)
{ ... }
}
Здесь я хотел бы, чтобы класс BaseOutput
был недоступен для клиентов моей библиотеки, но разрешить публичный подкласс MyOutput
. Я знаю, что С# не позволяет базовым классам иметь более ограничительный доступ, чем подклассы, но есть ли другой законный способ достижения такого же эффекта?
UPDATE
Мое решение для этой конкретной библиотеки состоит в том, чтобы сделать базовый класс public
и abstract
, и документировать его с помощью "Не использовать этот базовый класс напрямую". Я также создаю конструктор базового класса internal
, который эффективно запрещает внешним клиентам использовать или наследовать класс.
(Это позор, потому что другие языки O-O позволяют мне иметь скрытые базовые классы.)