È possibile creare una classe base C# accessibile solo all'interno dell'assieme di librerie in cui è compilata, mentre rende pubbliche altre sottoclassi che ne ereditano?C# private (hidden) classe base
Ad esempio:
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)
{ ... }
}
Qui vorrei classe BaseOutput
di essere inaccessibile ai clienti di mia libreria, ma permettono la sottoclasse MyOutput
di essere completamente pubblico. So che C# non consente alle classi base di avere un accesso più restrittivo rispetto alle sottoclassi, ma esiste un altro modo legale per ottenere lo stesso effetto?
UPDATE
La mia soluzione per questo particolare biblioteca è quello di rendere la classe base public
e abstract
, e di documentare con "Non utilizzare questa classe di base direttamente". Faccio anche il costruttore della classe base internal
, che impedisce efficacemente ai client esterni di utilizzare o ereditare la classe.
(E 'un peccato, perché altre lingue O-O mi permetta di avere nascosto le classi di base.)
perché non si rende il costruttore di 'BaseOutput' interno in modo che nessun codice esterno possa ereditarlo? –
@mikez: Sì, è quello che ho fatto, vedere l'aggiornamento sopra. –
public class con costruttore interno potrebbe essere un'opzione migliore (esempio nella mia risposta) –