Можно ли сделать базовый класс C# доступным только внутри сборки библиотеки, в которую он скомпилирован, а другие подклассы, которые унаследованы от него, сделать общедоступными?
Например:
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
был полностью открытым. Я знаю, что C# не позволяет базовым классам иметь более ограниченный доступ, чем подклассы, но есть ли другой законный способ добиться того же эффекта?
UPDATE
Мое решение для этой конкретной библиотеки состоит в том, чтобы сделать базовый класс public
и abstract
и задокументировать его с помощью «Не использовать этот базовый класс непосредственно». Я также делаю конструктор базового класса внутренним
, что эффективно предотвращает использование или наследование класса внешними клиентами.
(Обидно, потому что другие языки OO позволяют мне иметь скрытые базовые классы.)