Warum stellt C # das C ++ - Stil-Friend-Keyword nicht zur Verfügung?
Den C++ friend-Schlüsselwort ermöglicht eine class A
zu benennen class B
wie sein Freund. Dies ermöglicht Class B
Zugriff auf die private
/protected
Mitglieder class A
.
Habe ich noch nichts gelesen, warum dies wurde in C# (und VB.NET). Die meisten Antworten auf diese früher StackOverflow-Frage scheinen zu sagen es ist ein nützliches Teil von C++ und es gibt gute Gründe, es zu benutzen. In meiner Erfahrung würde ich Zustimmen.
Anderen Frage scheint mir zu sein, wirklich zu Fragen, wie etwas zu tun, ähnlich wie friend
in einer C# - Anwendung. Während die Antworten in der Regel drehen sich um geschachtelte Klassen, es scheint nicht ganz so elegant wie mit der friend
Stichwort.
Original Design-Patterns-Buch verwendet es regelmäßig in seinen Beispielen.
So, in Zusammenfassung, warum ist friend
fehlen von C#, und was ist "best practice" - Weg (oder die Wege) zu simulieren, die es in C#?
(Durch die Art und Weise, die internal
Schlüsselwort ist nicht das gleiche, es ermöglicht alle Klassen innerhalb der gesamten assembly für den Zugriff auf internal
Mitglieder, während friend
ermöglicht es Ihnen, eine bestimmte Klasse vollständigen Zugriff zu genau eine anderen Klasse)
InformationsquelleAutor der Frage Ash | 2008-10-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Freunde, bei der Programmierung ist mehr oder weniger als "schmutzig" und leicht zu missbrauchen. Es bricht die Beziehungen zwischen den Klassen und räumt mit einigen grundlegenden Eigenschaften einer OO-Sprache.
That being said, es ist ein nettes feature und ich habe es viele Male selbst in C++; und möchte, um es in C# auch. Aber ich Wette, dass da von C#'s "Reine" OOness (im Vergleich zu C++'s pseudo OOness) MS entschieden, weil Java hat keine friend-Schlüsselwort in C# sollte nicht entweder (nur ein Scherz ;))
Auf eine ernste beachten Sie: die interne ist nicht so gut, als Freund, aber es tut den job zu erledigen. Denken Sie daran, dass es selten ist, dass Sie verteilen Ihren code zu 3rd-party-Entwickler nicht über eine DLL, so lange, wie Sie und Ihr team wissen über die internen Klassen und deren Verwendung Sie sollten in Ordnung sein.
BEARBEITEN Lassen Sie mich klarstellen, wie das friend-Schlüsselwort untergräbt OOP.
Private und protected Variablen und Methoden sind vielleicht der wichtigste Teil der OOP. Die Idee, die Objekte halten kann-Daten oder-Logik, die nur Sie verwenden können, können Sie schreiben Sie Ihre Implementierung von Funktionen unabhängig von Ihrer Umgebung - und, dass Sie Ihre Umwelt nicht verändern können Status-Informationen, dass es nicht geeignet. Von mit Freundin Sie sind auf der Kopplung zweier Klassen-Implementierungen zusammen - und das ist viel schlimmer dann, wenn Sie gerade gekoppelt, Ihre Schnittstelle.
InformationsquelleAutor der Antwort nlaq
On a side note.
Mit Freund wird nicht über die Verletzung der Kapselung, sondern im Gegenteil, es geht um die Durchsetzung. Wie Accessoren+Mutatoren, Operatoren überladen, öffentlicher Vererbung, downcasting, etc., es ist oft missbraucht, aber es bedeutet nicht, dass das keyword nicht, oder noch schlimmer, einen schlechten Zweck.
Sehen Konrad Rudolph's Nachricht in den anderen thread, oder wenn Sie bevorzugen, finden Sie den entsprechenden Eintrag in der C++ FAQ.
InformationsquelleAutor der Antwort Luc Hermitte
Zur info, in einem anderen Zusammenhang-aber-nicht-ganz-der-gleichen Sache .NET ist
[InternalsVisibleTo]
können einer assembly festlegen einer anderen Baugruppe (z.B. ein unit test, assembly) , (effektiv), "internen" Zugang zu Arten/Mitglieder in der ursprünglichen assembly.InformationsquelleAutor der Antwort Marc Gravell
Sollten Sie in der Lage sein zu erreichen die gleiche Art von Dingen, die "Freund" verwendet wird, für die in C++ durch die Verwendung von interfaces in C#. Es erfordert, dass Sie explizit festlegen, welche Elemente übergeben werden, die zwischen den beiden Klassen, das ist extra Arbeit, aber vielleicht auch leichter, den code zu verstehen.
Wenn jemand ein Beispiel für eine sinnvolle Nutzung der "Freund" das kann nicht simuliert mittels interfaces, bitte teilen Sie es! Ich würde gerne besser verstehen, die Unterschiede zwischen C++ und C#.
InformationsquelleAutor der Antwort Parappa
Mit
friend
eine C++ - designer hat eine genaue Kontrolle über denen der privaten* Mitglieder ausgesetzt sind. Aber, er ist gezwungen zu entlarven jeder von den privaten Mitgliedern.Mit
internal
eine C# - designer hat eine genaue Kontrolle über die privaten Mitglieder, die er aufdeckt. Offensichtlich kann er aussetzen, nur ein einziger private member. Aber, es wird ausgesetzt, bis alle Klassen in der assembly.In der Regel ein designer wünscht, stellen nur einige private Methoden, um ausgewählte paar andere Klassen. Zum Beispiel, in einer Klasse-Fabrik-Muster kann es wünschenswert sein, die Klasse C1 instanziiert wird nur durch die Klasse factory-CF1. Daher Klasse C1 haben einen protected-Konstruktor und ein Freund class factory CF1.
Wie Sie sehen können, haben wir 2 Dimensionen, entlang denen die Kapselung kann durchbrochen werden.
friend
Verstöße gegen Sie entlang einer dimension,internal
hat es entlang der anderen. Das ist ein schlimmer Bruch in der Kapselung Konzept? Schwer zu sagen. Aber es wäre schön beides zu habenfriend
undinternal
erhältlich. Außerdem eine gute Ergänzung zu diesen beiden wäre die 3. Art von Schlüsselwort, das verwendet werden würde, über member-by-member-basis (wieinternal
) und gibt die Ziel-Klasse (wiefriend
).* Der Kürze halber verwende ich "private" anstelle von "private und/oder geschützt werden".
- Nick
InformationsquelleAutor der Antwort Nick Alexeev
Können Sie in der Nähe C++ "Freund" mit dem C# - Schlüsselwort "interne".
InformationsquelleAutor der Antwort jeffm
Freund ist sehr nützlich beim schreiben von unit-test.
Während das kommt zu einem Preis von umweltschädlichen Ihre Klasse Erklärung leicht, es ist auch ein compiler erzwungene Erinnerung an das, was tests eigentlich könnte die Versorgung über den internen Zustand der Klasse.
Sehr nützlich und sauber Redewendung, die ich gefunden habe ist, wenn ich die factory-Klassen, so dass Sie Freunde der Gegenstände, die Sie erstellen, die eine protected-Konstruktor. Genauer gesagt, dies war, als ich hatte eine einzige Fabrik verantwortlich für die Erstellung von passenden rendering-Objekte für report-writer-Objekten, rendering, die zu einer gegebenen Umwelt. In diesem Fall müssen Sie einen einzigen Punkt des Wissens über die Beziehung zwischen der report-writer-Klassen (Dinge wie Bild-Blöcke, layout-bands, Kopfzeilen etc.) und die dazu passenden rendering-Objekte.
InformationsquelleAutor der Antwort Andy Dent
Dies ist eigentlich kein Problem mit C#. Es ist eine grundlegende Einschränkung in IL. C# ist begrenzt durch diese, wie jede andere .Net-Sprache, soll überprüfbar sein. Diese Einschränkung umfasst auch managed-Klassen definiert, die in C++/CLI (Spec-Abschnitt 20.5).
Dass sein sagte ich denke, dass Nelson eine gute Erklärung, warum dies eine schlechte Sache.
InformationsquelleAutor der Antwort JaredPar
C# fehlt "Freund" - Schlüsselwort aus dem gleichen Grund fehlt deterministische Zerstörung. Ändern von Konventionen macht die Menschen fühlen sich schlau, wie wenn Ihr neue Wege überlegen, um jemand anderes' alten Wege. Es geht um stolz.
Sagen, dass "friend-Klassen sind schlecht" ist so kurzsichtig, wie andere unqualifizierte Aussagen wie "benutze keine gotos" oder "Linux ist besser als Windows".
Den "Freund" keyword Kombination mit einer proxy-Klasse ist eine großartige Möglichkeit, um nur aussetzen bestimmte Teile einer Klasse zu bestimmten anderen Klasse(N). Eine proxy-Klasse kann als eine Vertrauenswürdige Barriere gegen alle anderen Klassen. "öffentlichkeit" nicht zulässt, dass solche Ausrichtung, und mit "geschützt", um die Wirkung bei der Vererbung ist umständlich, wenn es wirklich keine konzeptionelle "ist ein" - Beziehung.
InformationsquelleAutor der Antwort Matthew
In der Tat, C# gibt die Möglichkeit, um dasselbe Verhalten in reinen OOP-Weise, ohne Besondere Worte - es ist für private Schnittstellen.
Soweit Frage Was ist das C# - äquivalent Freund? markiert wurde als Duplikat zu diesem Artikel, und niemand da vorschlagen wirklich gute Umsetzung - ich zeige Antwort auf beide Fragen hier.
Grundidee wurde von hier: Was ist eine private Schnittstelle?
Sagen wir mal, benötigen wir eine Klasse, die könnte verwalten von Instanzen von anderen Klassen und rufen Sie einige spezielle Methoden. Wir wollen nicht zu geben, Möglichkeit zum aufrufen dieser Methoden auf andere Klassen. Das ist genau das gleiche, was Freund c++ - Schlüsselwort do in c++ Welt.
Ich glaube, gutes Beispiel in der realen Praxis werden könnte, auch in Vollem Zustand-Maschine Muster, bei dem einige controller update aktuelle state-Objekt und wechseln Sie zu einem anderen Zustand-Objekt, wenn nötig.
Können Sie:
alle verstehen, warum es schlecht ist.
Klassen auf eine weitere assembly, aber auch dann ist jede Klasse in der assembly
nennen könnte jede interne Methode.
Controller.cs
Programm.cs
Gut, was ist mit Vererbung?
Brauchen wir Technik, die in Da explicit interface member-Implementierungen können nicht als virtual deklariert werden und mark IState als geschützt zu geben, Möglichkeit zum ableiten von Controller zu.
Controller.cs
PlayerIdleState.cs
- Und schließlich Beispiel, wie man die test-Klasse Controller werfen Vererbung:
ControllerTest.cs
Hoffe, dass ich alle Fälle abdecken kann, und meine Antwort war hilfreich.
InformationsquelleAutor der Antwort max_cn
Stop Entschuldigungen für diese Einschränkung. Freund ist schlecht, aber die interne ist gut? Sie sind die gleiche Sache, nur, dass Freund gibt Ihnen genauere Kontrolle darüber, wer zugreifen darf und wer nicht.
Dies ist zur Durchsetzung der Kapselung Paradigma? so haben Sie zu schreiben accessor-Methoden und was nun? wie soll man das stoppen jeder (außer den Methoden der Klasse B) aus aufrufen dieser Methoden? Sie können nicht, weil Sie nicht kontrollieren können, dies entweder, weil der fehlende "Freund".
Keine Programmiersprache ist perfekt. C# ist eine der besten Sprachen, die ich gesehen habe, aber dumme Ausreden für fehlende Funktionen, ist niemandem geholfen. In C++ vermisse ich die easy event/delegate-system, Reflexion (+automatische de - /Serialisierung) und foreach, aber in C# ich vermisse operator überladen (ja, die sagen mir immer, dass Sie nicht brauchen), default-Parameter, const, die nicht umgangen werden kann, ist die mehrfache Vererbung (ja, die sagen mir immer, dass Sie nicht brauchen und die Schnittstellen waren ein geeigneter Ersatz) und die Möglichkeit, zu entscheiden, zum löschen einer Instanz aus dem Speicher (keine, dies ist nicht furchtbar schlecht, es sei denn, Sie sind ein Tüftler)
InformationsquelleAutor der Antwort Algoman
Es ist das InternalsVisibleToAttribute da .Net 3, aber ich vermute, dass Sie nur Hinzugefügt, gerecht zu werden Versuchsanordnungen nach dem Aufstieg von unit-Tests. Ich kann nicht sehen, viele andere Gründe.
Funktioniert es auf der assembly-Ebene, aber es macht den job, wo die internen nicht; das ist, wo Sie verteilen möchten, eine Montage, aber möchten, dass ein anderes nicht-verteilten Montage zu haben privilegierten Zugang zu ihm haben.
Recht bedürfen Sie der Freund der Montage zu stark kodiert, um zu vermeiden, jemand erstellen eine pretend Freund neben Ihr geschützt Montage.
InformationsquelleAutor der Antwort Chris Woodward
Ich habe gelesen, dass viele intelligente Kommentare zu "friend" - Schlüsselwort & ich Stimme dem, was es ist nützliche Sache, aber ich denke, was "interne" Stichwort ist weniger nützlich, & Sie beide immer noch schlecht für Reine OO-Programmierung.
Was wir haben? (Sprichwort über "Freund" ich habe mir auch sagen, über "interne")
ja;
ist nicht mit "Freund" macht code besser?
Mit Freundin macht einige lokale Probleme, die nicht mit macht es Probleme, die für die code-Bibliothek-Nutzer.
die gemeinsame gute Lösung für die Programmierung Sprache, die ich nicht sehen wie diese:
Was haltet Ihr davon? Ich denke, dass es die häufigsten & Reine Objekt-orientierte Lösung. Sie können open-access-jede Methode, die Sie wählen, um jede Klasse, die Sie möchten.
InformationsquelleAutor der Antwort FadeToBlack
Ich vermute, es hat etwas zu tun mit der C# - Zusammenstellung Modell-Bau IL die JIT-Kompilierung zur Laufzeit. d.h.: der gleiche Grund, die C# - generics sind fundamental anders als in C++, generics.
InformationsquelleAutor der Antwort
Wenn Sie arbeiten mit C++ und finden Sie Ihr selbst mit friend-Schlüsselwort, es ist ein sehr starkes Indiz dafür, dass Sie haben ein design-Problem, weil, warum zum Teufel eine Klasse benötigt, die Zugriff auf private Mitglieder der anderen Klasse??
InformationsquelleAutor der Antwort bashmohandes
können Sie privat halten und reflektion verwenden, um Funktionen aufzurufen. Test-framework können dies tun, wenn Sie Sie bitten, es zu testen, eine private Funktion
InformationsquelleAutor der Antwort vishal
Ich verwendet, um regelmäßig zu verwenden Freund, und ich glaube nicht, dass es ein Verstoß gegen die OOP-oder ein Zeichen für eine Designfehler. Es gibt mehrere Orte, wo es ist das effizienteste Mittel, um das richtige Ende mit der geringsten Menge von code.
Konkreten Beispiel ist es beim erstellen von interface Baugruppen, die eine Kommunikations-Schnittstelle zu einer anderen software. In der Regel gibt es ein paar Schwergewichts-Klassen, die Bewältigung der Komplexität des Protokolls und peer Besonderheiten, und bieten eine relativ einfache verbinden/Lesen/schreiben/weiterleiten/trennen Sie das Modell mit übergeben Nachrichten und Meldungen zwischen der client-Anwendung und der Montage. Diese Nachrichten /Benachrichtigungen werden müssen verpackt in Klassen. Die Attribute müssen in der Regel manipuliert werden, indem die Protokoll-software, wie es ist, Ihren Schöpfer, aber viele Sachen bleiben nur-lese-zu der Außenwelt.
Es ist einfach albern zu erklären, dass es ein Verstoß gegen die OOP für das Protokoll /"creator" - Klasse zu haben Intim Zugriff auf alle erstellten Klassen -- der Schöpfer Klasse musste bit munge jedes bit der Daten auf dem Weg nach oben. Was ich gefunden habe, am wichtigsten ist, zu minimieren alle BS Zeilen extra-code "OOP für OOP 's Sake" - Modell führt in der Regel zu. Extra spaghetti macht einfach mehr bugs.
Haben die Leute wissen, dass Sie anwenden können, die interne keyword-am-Attribut, Eigenschaft, Methode und Ebene? Es ist nicht nur für die top-level Klassen-Deklaration (obwohl die meisten Beispiele scheinen zu zeigen, dass.)
Wenn Sie eine C++ - Klasse, nutzt das friend-Schlüsselwort, und emulieren möchten, die in einer C# - Klasse:
1. deklarieren Sie die C# - Klasse, die öffentliche
2. deklarieren Sie alle Attribute/Eigenschaften/Methoden, die geschützt sind in C++ und damit zugänglich für Freunde als intern in C#
3. erstellen nur-lese Eigenschaften, die für den öffentlichen Zugang zu allen internen Attribute und Eigenschaften
Ich Zustimmen, dass es nicht 100% das gleiche wie Freund-und unit-test ist ein sehr wertvolles Beispiel für die Notwendigkeit von so etwas wie der Freund (als ist-Protokoll-analyzer logging-code). Doch intern stellt die Belichtung auf die Klassen, die Sie haben wollen, Belichtung und [InternalVisibleTo()] übernimmt den rest -- scheint, wie es geboren wurde speziell für unit-Tests.
Soweit friend "sei besser, weil Sie sich explizit Steuern, welche Klassen Zugriff haben" -- was solls es gibt eine Reihe von verdächtigen bösen Klassen in der gleichen assembly in den ersten Platz? Partition Ihre Baugruppen!
InformationsquelleAutor der Antwort Christo
Die Freundschaft kann simuliert werden durch die Trennung von Schnittstellen und Implementierungen. Die Idee ist: "Erfordern eine konkrete Instanz zu beschränken aber Bau den Zugang dieser Instanz".
Beispielsweise
Trotz der Tatsache, dass
ItsMeYourFriend()
ist öffentlichkeit nurFriend
Klasse zugreifen können, da niemand sonst kann eine konkrete Instanz derFriend
Klasse. Es hat einen privaten Konstruktor, während die FabrikNew()
Methode gibt eine Schnittstelle.Finden Sie in meinem Artikel Freunde und internen Schnittstellen-Mitglieder, die an keinen Kosten, mit Codierung, Schnittstellen für details.
InformationsquelleAutor der Antwort Reuven Bass
Einige haben vorgeschlagen, dass die Dinge außer Kontrolle geraten kann durch die Verwendung Freund. Dem würde ich Zustimmen, aber das bedeutet nicht vermindern seine Nützlichkeit. Ich bin nicht sicher, dass Freund unbedingt weh tut, das OO-Paradigma nicht mehr, als dass alle Ihre Klasse-Mitglieder öffentlich. Sicherlich ist die Sprache, die Ihnen erlauben, alle Ihre Mitglieder, die öffentlichkeit, aber es ist eine disziplinierte Programmierer, die vermeidet, dass diese Art von design pattern. Ebenfalls eine disziplinierte Programmierer würde behalten uns die Verwendung von "Freund" für bestimmte Fälle, in denen es Sinn macht. Ich fühle innere macht zu viel in einigen Fällen. Warum setzen Sie eine Klasse oder Methode, um alles, was in der Versammlung?
Habe ich eine ASP.NET Seite erbt meine eigene Basis-Seite, die wiederum inherits System.Web.UI.Seite. In dieser Seite habe ich einige code, der verarbeitet die end-user die Fehlerberichterstattung für die Anwendung in einem geschützten Methode
Nun, ich habe ein Benutzersteuerelement, die in der Seite enthalten. Ich möchte die Benutzer Steuern zu können, rufen Sie die error-reporting-Methoden in der Seite.
Kann es nicht tun, wenn die ReportError-Methode ist geschützt. Ich kann machen Sie es intern, aber es ausgesetzt ist, zu jedem code in der assembly. Ich will ihn ausgesetzt, um die UI-Elemente, die Teil der aktuellen Seite (einschließlich der untergeordneten Steuerelemente). Genauer gesagt, möchte ich meine base control-Klasse definieren, die genau die gleiche Fehler-reporting-Methoden, und einfach aufrufen von Methoden in der base-Seite.
Ich glaube, dass so etwas wie Freund nützlich sein könnte, und implementiert in der Sprache, ohne dass die Sprache weniger "OO" wie, vielleicht als Attribute, so dass Sie können Klassen oder Methoden sein, Freunde auf bestimmte Klassen oder Methoden, so dass die Entwickler zu sehr spezifischen Zugang. Vielleicht so etwas wie...(pseudo-code)
Im Fall meiner vorherigen Beispiel, das vielleicht so etwas wie die folgende (man kann argumentieren, Semantik, sondern ich versuche nur auf die Idee kommen quer):
Wie ich es sehe, ist der Freund Konzept hat nicht mehr Risiko als Dinge öffentlich zu machen, oder das erstellen von öffentlichen Methoden und Eigenschaften für den Zugriff auf Mitglieder. Wenn alles friend erlaubt einer anderen Ebene der Granularität, in der Zugänglichkeit von Daten und ermöglicht es Ihnen, zu schmal, dass die Zugänglichkeit eher als Erweiterung mit internen oder öffentlichen.
InformationsquelleAutor der Antwort Scott Forbes
B. s.d....
Es wurde festgestellt, dass, Freunden weh tut, rein OOness. Dem Stimme ich zu.
Es wurde auch festgestellt, dass Freunde helfen Kapselung, die ich auch einverstanden.
Ich denke Freundschaft sollte Hinzugefügt werden, um die OO-Methodik, aber nicht ganz so wie es in C++. Ich würde gerne einige Felder/Methoden, die mein Freund Klasse zugreifen kann, aber ich würde NICHT wie Sie auf ALLE meine Felder/Methoden. Wie im realen Leben würde ich lassen, meine Freunde Zugriff auf meine persönlichen Kühlschrank, aber ich würde nicht zulassen, Ihnen den Zugriff auf meine bank Konto.
Kann man implementieren, die wie folgt
Wird natürlich erzeugen einen compiler-Warnung und verletzt die intellisense. Aber es wird die Arbeit tun.
On a side note, ich denke, dass ein überzeugter Programmierer sollten die unit-Tests ohne Zugriff auf die privaten Mitglieder. das ist ziemlich aus dem Rahmen, aber versuchen, darüber zu Lesen, TDD.
allerdings, wenn Sie immer noch wollen, dies zu tun (mit c++ wie Freunde) versuchen, so etwas wie
so schreiben Sie alle Ihre code ohne Definition UNIT_TESTING und wenn Sie wollen, um die unit-Tests fügen Sie #define UNIT_TESTING auf die erste Zeile der Datei(und schreiben Sie alle code, unit-Tests unter #wenn UNIT_TESTING). Das sollte vorsichtig gehandhabt werden.
Da ich denke, dass unit-Tests ist ein schlechtes Beispiel für die Nutzung von Freunden, würde ich ein Beispiel geben, warum ich denke, Freunde können gut sein. Angenommen, Sie haben ein Bremssystem (Klasse). Mit der Nutzung, dem Bremssystem bekommen verschlissen und müssen renoviert werden. Nun, Sie wollen, dass nur ein zugelassener Mechaniker beheben würde. Um das Beispiel weniger trivial würde ich sagen, dass die Mechaniker verwenden würde, seine persönliche (private) - Schraubendreher, um es zu beheben. Das ist, warum die Mechaniker-Klasse sollte sein Freund breakingSystem Klasse.
InformationsquelleAutor der Antwort ehud117
Die Freundschaft kann auch simuliert werden, indem "agents" - einige innere Klassen. Betrachten Sie Folgendes Beispiel:
Es könnte sein, viel einfacher, wenn der Zugriff nur auf statische Mitglieder.
Vorteile für eine solche Umsetzung ist, dass alle Typen deklariert sind, die in dem inneren Umfang der Freundschaft-Klassen und, im Gegensatz zu Schnittstellen, die es ermöglicht, statische member, auf die zugegriffen werden.
InformationsquelleAutor der Antwort Aberro
Ich Antworte nur: "Wie" - Frage.
Gibt es so viele Antworten hier, jedoch möchte ich vorschlagen eine Art "design-pattern" zu erreichen sind. Ich verwenden eine einfache Sprache-Mechanismus, der umfasst:
Zum Beispiel haben wir 2 main Klassen: Student und Universität. Student GPA die einzige Universität zugreifen dürfen. Hier ist der code:
InformationsquelleAutor der Antwort Rami Yampolsky
Felder, ALLE Klassen zugreifen können, Sie sind
public
.Felder, NICHT alle anderen Klassen zugreifen können, Sie sind
private
.(wenn die Felder gehört (deklariert innen) Basis Klasse, dann sind Sie
protected
statt)Felder, nur Ihre Besitzer Klasse können auf Sie zugreifen, sind
private
und haben keine Eigenschaften und get-set-Methoden.Felder, die nur Ihre Besitzer Klasse und einige anderen Klassen zugreifen können, Sie sind
private
und jede hat spezielleprivate
get-und set-Methoden und -public
teilen Methoden.Einige andere Klassen, die ebenfalls Zugriff auf diese Felder haben einige
private
Bereichen delegieren Arten und speziellepublic
direkte Methoden.Beispiel:
Muss man wissen, dass mit dem 'Freund' - Schlüsselwort von C++ ist, um zu ermöglichen, dass einige Klassen zu teilen Ihre privaten Mitglieder zu einigen anderen Klassen direkt.
Weil der, der 'Freund' - Schlüsselwort nicht vorhanden ist in C#, Klassen, die keine Möglichkeit haben, teilen Ihre privaten Felder zu einigen anderen Klassen direktaber es ist Weise zu simulieren, die es in der Tat, wie ich oben gezeigt.
Wissen Sie, dass der 'Freund' - Schlüsselwort von C++ kann auch ermöglichen, bei der Umsetzung einiger Funktionen, die Zugriff auf private Mitglieder einige Instanzen von Klassen-Typen?
Die Antwort ist ja, und ich werde Ihnen zeigen, wie Sie simulieren diese auch in C#:
Beispiel:
Ich muss zugeben, dass bevor ich gepostet diesen code, ich wusste nicht, wie um herauszufinden, die
MethodInfo
von der vorherigen Methode, die die aktuelle Methode aufgerufen wurde, aber Firas Assaad ' s Antwort hat mir geholfen, Dank ihm zu.Wie finde ich die Methode, die die aktuelle Methode aufgerufen wurde?
Er schlug vor, mit der
System.Diagnostics.StackTrace
KlasseHoffe, Sie haben meine Idee, und das hilft und beantwortet deine Frage.
Ich nicht finden, diese Antwort irgendwo im internet, ich dachte über diese Idee von mir mit meinem Gehirn.
InformationsquelleAutor der Antwort Farewell Stack Exchange