?
volkard schrieb:
ich bin sicher, dir fällt ein einleuchtendes beispiel ein, wo ein ganzes rudel klassen gegenseitig kenntnis der interna haben sollte, weswegen man einen haufen package-interne members baut. bin gespannt drauf. meine c++-scheuklappen erlauben mir gerade nicht, so eins zu finden.
Was heißt "ein Haufen"? Wie gesagt, solche Fälle sollten ähnlich selten sein wie friend. Für mich sind Fälle vorstellbar, wo du eine Klassenhierarchie hast:
package Malzeug {
public abstract class Bild {
< einige Methoden >
internal IntPtr myNativeImageHandle;
}
internal class GebuffertesBild : Bild { }
internal class AnderesSpeziellesBild : Bild { }
public abstract class Malfläche {
protected Bild getMyImage();
private Bild aktuellesBild;
}
}
Man hat hier eine Lib, die es erlaubt, schnell eigene Malflächen zu erstellen und auch das enthaltene Bild darin zu benutzen und zu bearbeiten. Aber unter keinen Umständen braucht irgendein komisches Betriebssystem-Handle nach außen gelangen. Mit "außen" ist hier natürlich das Package gemeint, die Grenze zwischen dem Implementierer der Malzeug-Lib und dem Benutzer der Lib.
Gleichzeitig ist aber klar, dass die abgeleiteten Bild-Klassen das Handle noch benötigen. Du magst jetzt argumentieren, dass durch das internal _alle_ Klassen im package an das Handle kommen. Das ist richtig, aber das package wird von _einem_ Team erstellt und ein Package hat eine überschaubare Menge von Klassen, es ist also relativ absehbar, wer alles an das Handle kommt und damit was machen kann. Mit Sicherheit kein Benutzer der Lib.
Demgegenüber, bei dir sind sozusagen alle Klassen public. Da wäre das erst wirklich ein Problem, wenn das Handle protected wäre. Also müsstest du alle abgeleiteten Klassen friend machen und das ist mal wirklich schlechter Stil, wenn die Basisklasse ihr abgeleiteten Klassen kennt.
Überhaupt benutzt man Packages häufiger dazu, den Zugriff zu beschränken, anstatt den Zugriff zu öffnen. Du denkst, ich will dir die ganze Zeit erzählen, dass das tolle an Packages ist, dass man package-interne Klassenmember machen kann. Das tolle ist aber, dass man Package-interne Klassen machen kann.
Eine Klasse ist nicht besonders genug, innerhalb eines Programms. Ich schreibe für jeden Dreck eine Klasse, sogar für einen Vektor. Ist doch klar, dass nur klassenweite Zugriffsregelungen für ein komplexes Programm nicht mehr ausreicht, man muss Klassen auch mal zu einer höheren Ordnung zusammenfassen können.