Laden...

Top-Level-Klassen => Nested Classes

Erstellt von json1948 vor 8 Jahren Letzter Beitrag vor 8 Jahren 2.817 Views
J
json1948 Themenstarter:in
37 Beiträge seit 2015
vor 8 Jahren
Top-Level-Klassen => Nested Classes

Hi Community,

ich habe in diversen Quellen recherchiert (überwiegend in Englisch).

Eine Top-Level-Klasse ist eine nicht verschachtelte Klasse! Sprich, sie steht direkt in der Namespace.

Bsp:

namespace projekt

{
 class meineKlasse {  }
}

Eine Klasse ist keine Top-Level-Klasse mehr sobald diese verschachtelt ist.

Bsp:

namespace projekt 

{

class meineKlasse // Top-Level-Klasse

{ class meineZweiteKlasse {} } // keine Top-Level-Klasse

}

Kann mir jemand folgende Aussage etwas genauer erklären: Eine nicht-verschachtelte Top-Level-Klasse besitzt die Eigenschaft mehrere Quelldateien zu haben!

Bei dieser Aussage ergeben sich mir 2 Fragen:

1.) Gibt es verschachtelte Top-Level-Klassen?
2.) Was ist mit Quelldatei gemeint?

Könnte jemand vielleicht etwas Licht ins dunkle bringen :S

16.827 Beiträge seit 2008
vor 8 Jahren

Die Bezeichnung "Top Level Class" habe ich noch nie gehört.
Beispiel 1, im Namespace ist einfach eine Class.
Beispiel 2, Klasse in Klasse ist einfach eine Nested Class.

Dahingehend sind die Fragen auch...doof.
Schau Dir dazu partial an. Das funktioniert auf allen Ebenen.
Denke das beantwortet alle Fragen.

127 Beiträge seit 2015
vor 8 Jahren

Das sehe ich auch so.
Den Begriff Top-Level Class höre ich im .NET Umfeld auch zum ersten mal.
Ich denke es könnte sich vielleicht um einen Übersetzungsfehler handeln ...

Normalerweise kann eine Klasse nur in einer einzigen Datei sein. (Zumindest ist mir nichts anderes bekannt)
Ausnahme ist eben durch das Schlüsselwort partial.
Dadurch kann ich den Sourcecode einer Klasse auf mehrere physische Dateien verteilen. An den Möglichkeiten / Eigenschaften einer Klasse im Objekt-orientierten Sinne ändert das aber nichts.

2.298 Beiträge seit 2010
vor 8 Jahren

Hallo,

zusätzlich zu dem was Abt schrieb, können auch Nested Classes aufgeteilt werden. - Voraussetzung ist halt, dass auch in der 2. Datei die eigentliche Klasse enthalten ist.

Folgendes funktioniert bei mir Problemlos (Beispielcode):

Klasse:


public partial class Bird : Animal
    {
        public Wing[] Wings { get; private set; }

        public Bird()
        {
            this.Wings = new Wing[2];
            Wing leftWing = new Wing();
            this.Wings[0] = leftWing;
            Wing rightWing = new Wing();
            this.Wings[1] = rightWing;
        }
        
        public partial class Wing
        {
            public float WingSpread { get; set; }

            public void Beat()
            {
                this.BeatUp();
                this.BeatDown();
            }
        }

        public void BeatWings()
        {
            this.Wings[0].Beat();
            this.Wings[1].Beat();
        }
    }

  1. Datei für Klasse:

    public partial class Bird
    {
        public partial class Wing
        {
            private void BeatUp()
            {}

            private void BeatDown()
            {}
        }
    }

Allerdings finde ich zu "Top-Level-Klassen" auch nur Sachen aus dem Bereich Java. Und sogar die wiedersprechen deinen gefundenen Informationen.

Geschachtelte Top-Level-Klassen

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

J
json1948 Themenstarter:in
37 Beiträge seit 2015
vor 8 Jahren

Also danke erstmal für Eure Antworten. Allerdings bin ich jetzt völlig verwirrt. Top-Level-Klassen sind definitiv ein Bestandteil des Skripts der Vorlesung.

Kann es eventuell sein, dass es in C++ so ist? aber es wurde ja schon erwähnt dass Top-Level-Klassen im Zusammenhang mit .Net noch nie aufgetaucht sind.

127 Beiträge seit 2015
vor 8 Jahren

Da mich das jetzt doch mal interessiert hat, dachte ich mir, es gibt nichts was Google nicht wüßte.
Also kurze Google Suche nach: Top-Level Klassen C#
ergab das der Begriff wohl häufiger im Java Kontext verwendet wird.

Ab dem 5. Link kommt auch ein Bezug zu C# zustande und zwar in einem Buch:
Hier wird der Begriff dann wohl eher als Bezeichnung (zur Erklärung) denn als Konstrukt bzw. Schlüsselwort verwendet.
Evtl. ist das auch bei euch so in der Vorlesung ...

J
json1948 Themenstarter:in
37 Beiträge seit 2015
vor 8 Jahren

Also hier die Endergebnisse meiner Recherchen:

Top-Level-Klassen:

Top Level Klassen sind Klassen, die direkt im Namespace deklariert sind. Die Deklaration einer Klasse innerhalb einer anderen Klasse führt zu dem Begriff Nested Klassen.

Top-Level-Klassen sind hierarchisch betrachtet auf der obersten Ebene und können aus anderen Quelldateien aufgerufen werden genau wie Nested Klassen. (Danke für den Hinweis Lando)

Wird eine verschachtelte Klasse als static deklariert, dann wird sie zu einer verschachtelten Top-Level Klasse.

Kann mir vielleicht jemand einige Eigenschaften einer verschachtelten Top-Level-Klasse nennen?

74 Beiträge seit 2014
vor 8 Jahren

[...] können aus anderen Quelldateien aufgerufen werden. Dies geht bei Nested Klassen nicht.

Stimmt nicht. Auch nested Klassen können angesprochen werden, vorausgesetzt sie sind entsprechend sichtbar. Geht so: var b = new ClassA.ClassB().

3.170 Beiträge seit 2006
vor 8 Jahren

Hallo,

Wird eine verschachtelte Klasse als static deklariert, dann wird sie zu einer verschachtelten Top-Level Klasse.

Wie kommst Du denn darauf, bzw. was soll das überhaupt bedeuten?
Wenn eine Klasse mit dem Modifizierer static deklariert wird, bedeuted das lediglich, dass auch alle ihre Member static sind (bzw. sein müssen) und somit vollständig ohne Erzeugen einer Instanz darauf zugegriffen werden kann.
Von wo aus der Zugriff auf was erlaubt ist, wird weiterhin über die Modifizierer public/private/internal gesteuert.

Eine Nested Class ist aber auf jeden Fall eine Nested Class und bleibt auch eine, egal ob static oder nicht.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

742 Beiträge seit 2005
vor 8 Jahren

Das mit static kommt von Java: Java - Nested Classes

3.170 Beiträge seit 2006
vor 8 Jahren

Hallo,

dem Link von inflames2k zufolge ist es so:

Geschachtelte Top-Level-Klassen oder -Interfaces sind wie die Paketbestandteile direkt für andere Klassen verfügbar. Es ist nicht erforderlich, zunächst ein Exemplar der umgebenden Klasse zu erzeugen.

Wenn das in Java nur geht, wenn die innere Klasse static ist, ergibt das auch einen Sinn.

In C# wären dann aber alle Nested Classes auch geschachtelte Top-Level-Klassen, sobald sie public sind, denn da kann man dann munter drauf zugreifen ohne Instanz der äußeren Klasse.

Gruß, MarsStein

Edit: Ich bin generell wie meine Vorredner der Ansicht, dass diese Java-Bezeichnung im .NET-Umfeld so nicht existieren und nicht übernommen werden sollten. Das ergibt keinen Sinn und stiftet nur Verwirrung.

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

F
10.010 Beiträge seit 2004
vor 8 Jahren

Ist doch das gleiche wie mit Attributen in Java und C#.

Aber die meisten Entwickler die nur eine Sprache kennen, glauben das die Begriffe überall gleich sind.

Erst wenn man mal mehr als eine Sprache wirklich gelernt hat, weis man das dem nicht so ist.