Ist es möglich, eine C# -Basisklasse nur innerhalb der Bibliotheksbaugruppe verfügbar zu machen, in die sie kompiliert wurde, während andere Unterklassen, die von ihr erben, öffentlich sind?C# private (versteckte) Basisklasse
Zum Beispiel:
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)
{ ... }
}
Hier würde Ich mag die BaseOutput
Klasse an Kunden meiner Bibliothek zu sein, unzugänglich, aber erlauben die Unterklasse MyOutput
vollständig öffentlich zu sein. Ich weiß, dass C# nicht zulässt, dass Basisklassen einen restriktiveren Zugriff als Unterklassen haben, aber gibt es einen anderen legalen Weg, denselben Effekt zu erzielen?
UPDATE
Meine Lösung für diese Bibliothek ist die Basisklasse public
und abstract
zu machen und es mit zu dokumentieren „diese Basis nicht-Klasse direkt verwenden“. Ich mache auch den Konstruktor der Basisklasse internal
, die effektiv verhindert, dass externe Clients die Klasse verwenden oder erben.
(Es ist eine Schande, weil andere O-O Sprachen lassen Sie mich Basisklassen versteckt haben.)
warum machen Sie nicht den Konstruktor von 'BaseOutput' intern, so dass kein externer Code davon erben kann? –
@mikez: Ja, das habe ich gemacht, siehe Update oben. –
öffentliche Klasse mit internem Konstruktor vielleicht eine bessere Option (Beispiel in meiner Antwort) –