Gibt es eine Möglichkeit, einzuschränken, wer eine Klasse oder Schnittstelle erben kann?

7

Ich frage mich, ob es eine Möglichkeit gibt, zu begrenzen, wer von einer Klasse erben kann.

  • internal : erlaubt keine Klassen außerhalb der Assembly
  • sealed : Klasse kann nicht vererbt werden

Gibt es ein Schlüsselwort oder eine Methode, um nur bestimmte Klassen (sagen wir nur aus dem eigenen Namespace) zu erlauben, diese Klasse zu erben?

Ich möchte auch nicht, dass diese spezielle Klasse generisch ist. Meine Sorge ist nicht Sicherheit, sondern das Design im Allgemeinen.

Beispiel was ich will:

  • Klasse A.
  • Klasse B erbt von A
  • Klasse C kann nicht von A
  • erben
Odys 25.12.2011, 21:28
quelle

2 Antworten

16
  

Gibt es eine Möglichkeit, nur bestimmten Klassen zu erlauben, diese Klasse zu erben?

Ja. Wenn der erbende Code teilweise vertrauenswürdig ist , können Sie einen Vererbungsbedarf für die Basisklasse festlegen, und die Laufzeitumgebung lädt die erbende Klasse nicht, wenn sie die Bedingungen nicht erfüllt der Nachfrage:

Ссылка

Natürlich bedeutet vollständiges Vertrauen vollständiges Vertrauen . Voll vertrauenswürdiger Code kann erben, was er will.

Ich vermute, dass Sie versuchen, Beschränkungen aufzuerlegen, die Sie eigentlich nicht durchsetzen sollten. Kannst du beschreiben, warum du diese schwierige Sache machst? Es gibt wahrscheinlich einen besseren Weg, um zu tun, was Sie wollen.

UPDATE:

  

Ich versuche, die Vererbung innerhalb meiner Klassen in derselben Assembly zu begrenzen.

Dann hätten Sie das wahrscheinlich zuerst gesagt.

Machen Sie alle Konstruktoren der Klasse intern. Um von einer Klasse zu erben, muss ein barrierefreier Konstruktor vorhanden sein. Wenn Sie alle Konstruktoren intern machen, können nur Klassen in dieser Assembly von der Basisklasse erben.

    
Eric Lippert 25.12.2011, 21:44
quelle
8

Soweit ich weiß, ist die Verwendung von internal die einzige Möglichkeit zu steuern, wer eine Klasse erben kann. Wenn sich die Vererber in einer anderen Assembly befinden müssen, können Sie Klassen einer anderen Assembly die Interna Ihrer Assembly anzeigen lassen, indem Sie InternalsVisibleTo Attribut (die Zielbaugruppe muss signiert sein, damit dies mit signierten Baugruppen funktioniert).

    
dasblinkenlight 25.12.2011 21:36
quelle

Tags und Links