2010-05-20 5 views
8

Wenn ich eine Klasse mit einer Methode haben möchte ich protected und internal. Ich möchte, dass nur abgeleitete Klassen in der Assembly sie aufrufen können.Was wählen Sie, geschützt oder intern?

Da protected internal bedeutet protectedoderinternal, müssen Sie eine Auswahl treffen. Was wählen Sie in diesem Fall - protected oder internal?

Antwort

5

Ich möchte, dass nur abgeleitete Klassen in der Versammlung es nennen würde.

Nun, Sie haben zwei Möglichkeiten. Du kannst es beschützen, und wenn einer deiner Kunden deine Klasse erweitert und deine Methode aufruft und du es erfährst, kannst du ihnen einen streng formulierten Brief schreiben, der ihnen sagt, bitte hör auf damit. Oder Sie können es intern machen und Codeüberprüfungen des Codes Ihrer Mitarbeiter durchführen, um sicherzustellen, dass sie nicht die Methode verwenden, die sie nicht verwenden sollen.

Meine Vermutung ist, dass letztere ist das billiger und einfacher, was zu tun. Ich würde es intern machen.

+3

** Es gibt möglicherweise eine dritte Wahl. ** Das OP könnte die * gesamte Klasse * intern machen, in welchem ​​Fall der 'geschützte' Zugriff auf die Methode das gewünschte Verhalten erreichen würde. Code außerhalb der Assembly kann über eine öffentliche Schnittstelle auf die Funktionalität der Klasse zugreifen. Dies kann ausreichen, um das gewünschte Verhalten des OP zu erreichen. Der Nachteil ist natürlich, dass alle Vererbung außerhalb der Versammlung verboten wäre ... aber das OP zeigt explizit nicht an, dass dies eine Voraussetzung ist. – LBushkin

3

Ich glaube, die richtige Wahl internal ist. Auf diese Weise können Sie Personen außerhalb Ihrer Assembly davor schützen, diese Methode aufzurufen, und Sie müssen nur vorsichtig sein und diese Methode nur von abgeleiteten Klassen aufrufen. Es ist einfacher, in der Versammlung, die du schreibst, vorsichtig zu sein, als zu hoffen, dass andere Leute vorsichtig sein würden, wenn sie es benutzen.

+2

Weitere Informationen hier: http://blogs.msdn.com/ericlippert/archive/2008/04/24/why-can-ti-access-a-protected-member-from-a-derived-class-part -three.aspx –

6

Persönlich würde ich beschützt wählen. Wenn Unterklassen in Ihrer eigenen Assembly gut genug sind, um die Methode aufzurufen, warum sollte eine Unterklasse in einer anderen Assembly fehlen? Vielleicht könnten Sie die Funktionalität in eine separate (interne) Klasse umgestalten.

Sie müssen wirklich objektiv über den Zweck des Verfahrens denken. Interne Zugänglichkeit fühlt sich fast immer falsch an. Meistens aufgrund meiner Erfahrung versucht, von Kontrollen oder Klassen im .NET-Framework abzuleiten, wo ich in eine Mauer gerannt bin, weil jemand entschied, eine Klasse oder Methode als intern zu markieren. Der ursprüngliche Autor hat nie bemerkt, dass der Zugriff auf diese Methode die Implementierung einer Unterklasse erschwert.

EDIT

Um zu klären, ist die interne Zugänglichkeit für eine Klasse sehr nützlich und ich war damit nicht sagen, intern im Allgemeinen schlecht ist. Mein Punkt war, dass interne Methoden in einer ansonsten öffentlichen Klasse mir falsch erscheinen. Eine ordnungsgemäß entworfene Basisklasse sollte abgeleiteten Klassen in derselben Baugruppe keinen unfairen Vorteil verschaffen.

+2

+1 von mir. Ich glaube nicht, dass ich jemals 'internal' benutzen musste. – Kobi

+0

Wie wäre es mit Fällen, in denen Sie eine Reflexion über die Assembly-Klassen haben und wenn die Unterklasse nicht berücksichtigt wird (weil sie außerhalb der Assembly liegt), wird diese Methode nicht richtig funktionieren? – brickner

+0

Einfache Frage. Ich musste nie Reflexion verwenden '') ' – Kobi

1

Es ist so eine schrullige Entscheidung zu machen protected internal bedeuten protected OR internal. Für diesen konkreten Fall würde ich internal verwenden. Der Grund ist, dass, wenn die Kapselung kaputt ist, würde ich lieber ich wäre, eher jemand, der nicht unter meiner Kontrolle ist.

0

Ich denke, die Antwort auf Ihre Bedürfnisse unterschiedlich ist. Wenn ich Sie wäre, würde ich so etwas tun:

public class YourClass 
    { 
     protected class InnerClass 
     { 
      internal void YourMethod() 
      { 
       // Your Code 
      } 
     } 
    } 
Verwandte Themen