C und höchstwahrscheinlich viele andere Sprachen bieten ein struct
Schlüsselwort zum Erstellen von Strukturen (oder ähnlichem). Diese sind (zumindest in C) aus vereinfachter Sicht wie Klassen, jedoch ohne Polymorphismus, Vererbung, Methoden usw.
Stellen Sie sich eine objektorientierte Sprache (oder eine Sprache mit mehreren Paradigmen) mit Strukturen im C-Stil vor. Wo würdest du sie den Klassen vorziehen? Ich glaube nicht, dass sie mit OOP verwendet werden sollen, da Klassen ihre Zwecke zu ersetzen scheinen, aber ich frage mich, ob es Situationen gibt, in denen sie Klassen in ansonsten objektorientierten Programmen vorgezogen werden könnten und in welchen Situationen. Gibt es solche Situationen?
Antworten:
In einigen Büchern habe ich einen Unterschied zwischen staatlich tragenden Objekten und funktionsbereitstellenden Objekten gesehen. Die genauen Begriffe unterscheiden sich von Quelle zu Quelle. Aber im Allgemeinen zeichnen sich die ersteren dadurch aus, dass sie eine Reihe von Feldern und eine ganze Reihe einfacher Getter-Setter-Paare (und möglicherweise einen Konstruktor) haben.
Diese sind in Java besonders häufig für Klassen, die explizit als "serialisierbar" gekennzeichnet sind.
Ich würde argumentieren, dass diese Art von Klassen als Strukturen am sinnvollsten ist, wenn Sie der Meinung sind, dass die Mitglieder nicht direkt ausgeblendet werden müssen (z. B. bei verschachtelten Typen).
quelle
In C gibt es keine Klassen, ebenso
struct
wie das Bündeln von Daten. In C ++struct
ist dies dasselbe wie mit derclass
Ausnahme, dass Vererbung und Mitgliederzugriffpublic
standardmäßig und nicht standardmäßig erfolgenprivate
. C # hat auch eine Artstruct
, aber ich weiß nicht genug C #, um es zu kommentieren. Common Lisp hat diedefstruct
Form, die unterstruct
Berücksichtigung des Sprachunterschieds so ähnlich wie C s funktioniert , und unterscheidet sich von einer Common Lisp Object System-Klasse.Es gibt jedoch einen konzeptionellen Unterschied zwischen einem verwandten Datenbündel und einer realen Klasse. In C ++
struct
wird es häufig für ein Datenbündel verwendet, währendclass
es für Objekte verwendet wird, die ihr eigenes Verhalten haben sollen. Als Richtlinie würde ich sagen, dass aclass
etwas darstellt, über das Sie etwas Nützliches sagen können, z. B. eine Klasseninvariante, während astruct
lockerer mit Datenwerten gekoppelt ist, die nicht wirklich stark von anderen abhängen.quelle
struct
und aclass
ist in C # bedeutender - das große Problem ist, dass astruct
ein Werttyp und aclass
ein Referenztyp ist. Microsoft empfiehlt, a nicht zu verwenden,struct
wenn der Inhalt größer als 16 Byte oder so ist.Was ist auf einer sehr einfachen Ebene der Unterschied zwischen einer Struktur und einer reinen Datenklasse (eine, die außer Eigenschaftszugriffsfunktionen keine Funktionalität hat)?
Nichts als der Speicherbedarf wirklich.
quelle
Die akzeptierte Antwort ist gut. Ich möchte nur hinzufügen ...
Manchmal ist es besser, eine Methode in eine Klasse einzufügen. In anderen Fällen ist es besser, eine externe Funktion zu haben, bei der die Struktur / Klasse als Parameter übergeben wird (auch wenn Sie den OOP-Stil verwenden).
Beispiel für das Einfügen einer Methode in die Klasse: Rectangle.CaclulateArea ()
Beispiel dafür, wann eine Funktion außerhalb der Klasse platziert werden soll: Canvas.Draw (Rectangle rect)
Sie könnten Draw () in das Rechteck einfügen und es würde funktionieren. Das Zeichnen ist jedoch eine tierabhängige Operation. Sie würden nicht auf der Serverseite zeichnen, sondern auf der Clientseite. Draw () wäre nicht sinnvoll, um überhaupt auf dem Server zu existieren. "CalculateArea ()" ist jedoch unabhängig von der Ebene und ein echtes Attribut des Rechtecks. Daher ist es besser, es als Elementmethode einzuschließen.
quelle
Für mich ist der große Unterschied, ob es eine Klasseninvariante gibt oder nicht.
Oder mit anderen Worten: Kann ich zu jedem Zeitpunkt ein Feld in einen Wert ändern? Wenn ja, ist es eine Struktur; Wenn nicht, ist es eine Klasse.
Das übliche Beispiel für eine Struktur ist ein 2D-Punkt mit nur einem X- und Y-Element, der einen beliebigen Wert haben kann und völlig unabhängig voneinander ist. Der öffentliche Zugang ist akzeptabel.
Ein Beispiel für eine Klasse ist die Kombination eines Zeigers auf ein Zeichenarray und eines Längenfelds: Die Länge hängt vom Wert des Zeigers ab und sollte daher keine Struktur sein. Die Felder sollten privat sein und der Zugriff sollte über Setter und Getter erfolgen, um sicherzustellen, dass die Klasse unveränderlich ist.
quelle
1) Netzwerke
struct
: Strukturen, die über das Kabel übertragen werden.Allgemeiner und formeller jede Klasse, für die Sie POD, Trivial, Standardlayout oder ein verwandtes Konzept benötigen. Eine ausgezeichnete Diskussion dieser Konzepte mit Beispielen finden Sie in dieser Antwort (für C ++ 11).
2) Funktoren (insbesondere Prädikate), die Sie an Funktionen wie übergeben würden
std::remove_if
. Andernfalls ausgedrückt, Klassenstd::binary_function
ähnlich von / geerbt von oder dergleichen.3) Metaprogrammierungskonzepte, die nur öffentliche
constexpr
s und / odertypedef
s enthalten dürfen.Bearbeiten: Hinweis: Diese Antwort gilt für C ++ - Klassen im Vergleich zu Strukturen.
quelle