Ich habe so etwas wie dieses bekam:Kann ich anderen Baugruppen verbieten, von einer Klasse zu erben?
// This gets implemented by plugin authors to get callbacks about various things.
public interface ExternalPlugin
{
// This gets called by the main application to tell the plugin some data
// is available or similar.
void DoStuff(SomeDataBlob blob);
}
// Data blob for v1 of API
public class SomeDataBlob
{
internal SomeDataBlob(string prop) { Prop = prop; }
// Some piece of data that V1 plugins need
public string Prop { get; private set; }
}
// FUTURE!
// Data blob API v2 of API
public class SomeDataBlobV2 : SomeDataBlob
{
// Can be passed to clients expecting SomeDataBlob no problem.
internal SomeDataBlobV2(string prop, string prop2) :base(prop) { Prop2 = prop2; }
// Some piece of data that V2 plugins need. V2 plugins can cast to this from
// SomeDataBlob, but still can load successfully into older versions that support
// only V1 of the API
public string Prop2 { get; private set; }
}
Ich habe SomeDataBlob
öffentlich zu machen, so dass sie als Mitglied der öffentlichen Schnittstelle Methode ExternalPlugin.DoStuff
verwendet werden kann. Ich möchte jedoch nicht zulassen, dass Clients von dieser Klasse erben und somit anfällig für das Problem der spröden Basisklasse sind. (Alle Derivate dieser Klasse sollten in derselben Baugruppe aufbewahrt werden.)
Das Markieren der Klasse sealed
geht zu weit, weil ich glaube, dass das Entfernen von sealed
eine kaputte API-Änderung ist; und selbst wenn das nicht ist, kann ich die SomeDataBlobV2
Clients immer noch die falsche Sache tun und von SomeDataBlob
direkt erben.
Gibt es eine Möglichkeit, diese Art von Muster durchzusetzen?
machen Sie es nur intern ... zuvor hier beantwortet ... http://StackOverflow.com/Questions/1223873/namespace-only-Class-visibility-in-C-net – phillip
Schnittstellen. Schnittstellen für den Sieg. –
@Guru: Dann können Clients, die "V2" der API verwenden, nicht feststellen, ob sie die neuen Funktionen von "V2" verwenden können. –