Was ist der Unterschied zwischen einer Eigenschaft und einer Instanzvariablen?

7

Ich denke, ich habe diese Begriffe austauschbar / falsch verwendet!

    
Iain 01.05.2009, 13:32
quelle

10 Antworten

17

Iain, das ist im Grunde eine Terminologiefrage und ist trotz des "sprachunabhängigen" Tags, der mit dieser Frage verbunden ist, sehr sprach- / umweltbezogen.

Bei Entwurfsdiskussionen können Eigenschaft und Instanzvariable synonym verwendet werden, da die Idee darin besteht, dass eine Eigenschaft ein Datenelement ist, das ein Objekt beschreibt.

Wenn Sie über eine bestimmte Sprache sprechen, können diese beiden verschieden sein. In C # ist eine Eigenschaft beispielsweise eine Funktion, die ein Objekt zurückgibt, während eine Instanzvariable eine nicht statische Membervariable einer Klasse ist.

    
Hershi 01.05.2009, 13:38
quelle
3

Hershi hat recht damit, sprachspezifisch zu sein. Aber um die Spur der sprachspezifischen Antworten zu ergänzen:

In Python ist eine Instanzvariable ein Attribut einer Instanz (im Allgemeinen), auf das im Wörterbuch der Instanz Bezug genommen wird. Dies ist analog zu Member- oder Instanzvariablen in Java, außer dass alles öffentlich ist.

Eigenschaften sind Verknüpfungen zu Getter / Setter-Methoden, die genau wie eine Instanzvariable aussehen . Daher in der folgenden Klassendefinition (modifiziert aus Guidos neuem Stilobjekt-Manifest ):

%Vor%

y ist eine Instanzvariable von z , x ist eine Eigenschaft. (Wo eine Eigenschaft definiert ist, gibt es einige Techniken, die verwendet werden, um die zugehörige Instanzvariable zu verdecken, so dass anderer Code nicht direkt darauf zugreift.) Der Vorteil von Eigenschaften in Python ist, dass ein Designer nicht herumlaufen muss Präventives Einkapseln aller Instanzvariablen, da die zukünftige Kapselung durch Konvertieren einer Instanzvariablen in eine Eigenschaft keinen vorhandenen Code unterbrechen sollte (es sei denn, der Code nutzt Lücken aus, die Ihre Kapselung zu beheben versucht, oder sich auf Klasseninspektionen oder andere Metas zu verlassen -Programmierungstechnik).

All dies ist eine sehr lange Antwort zu sagen, dass es auf der Design-Ebene gut ist, über Eigenschaften zu sprechen. Es ist agnostisch, welche Art von Kapselung Sie durchführen müssen. Ich denke, dieses Prinzip ist nicht sprachunabhängig, sondern gilt für Sprachen neben Python.

    
David Berger 01.05.2009 14:37
quelle
2

Codebeispiel in C # gemacht

%Vor%     
Tony 01.05.2009 13:35
quelle
2

In Ziel c ist eine Eigenschaft eine Instanzvariable, die den Vorteil eines überladenen Punktoperators nutzen kann, um Setter und Getter aufzurufen. So wird mein.Food="Cheeseburger" eigentlich als [mein SetFood: "Cheeseburger" interpretiert]. Dies ist ein weiterer Fall, in dem die Definition definitiv nicht sprachunabhängig ist, weil objective-c das Schlüsselwort @property definiert.

    
Nick Van Brunt 01.05.2009 18:33
quelle
1

Vielleicht liegt das daran, dass Sie zuerst aus C ++ kamen, oder ?! In meiner Schulzeit hatte ich Professoren, die ständig Klasseneigenschaften oder Klassenattribute sagten. Seitdem ich in die Java C # -Welt wechselte, hörte ich von Mitgliedern. Klassenmitglieder, Instanzmitglieder ...

Und dann Eigenschaften apear! in Java und .NET. Ich denke, es ist besser für Sie, es Mitglieder zu nennen. Entweder sind sie Instanzmitglieder (oder wie Sie es Instanzvariable genannt haben) oder Klassenmitglieder ....

Prost!

    
Txugo 01.05.2009 13:48
quelle
1

Eine Eigenschaft kann eine Instanzvariable zurückgeben, und ich nehme an, sie tut dies meistens, aber sie kann mehr. Sie könnten Logik in eine Eigenschaft einfügen, Werte zusammenfassen oder andere Instanzvariablen aktualisieren usw. Ich denke, es ist jedoch am besten, dies zu vermeiden. Logik sollte in Methoden eingehen.

    
Adam Asham 01.05.2009 14:05
quelle
0

In Java haben wir etwas namens JavaBeans-Eigenschaften , aber das ist im Grunde genommen eine Instanzvariable, die einem bestimmten Benennungsmuster für ihren Getter und Setter folgt.

    
willcodejavaforfood 01.05.2009 13:41
quelle
0

Um zu dem, was gesagt wurde, in einer Sprache wie C # hinzuzufügen, ist eine Eigenschaft im Wesentlichen eine Get-and-Set-Funktion. Daher kann es eine benutzerdefinierte Logik haben, die zusätzlich zum Abrufen / Festlegen ausgeführt wird. Eine Instanzvariable kann dies nicht tun.

    
Jacob Adams 01.05.2009 13:42
quelle
0

Eine Eigenschaft ist eine Art von Daten, die einem Objekt zugeordnet sind. Zum Beispiel ist eine Eigenschaft eines Kreises sein Durchmesser und ein anderer ist sein Bereich.

Eine Instanzvariable ist ein Datenelement, das in einem Objekt gespeichert wird. Es muss nicht unbedingt direkt mit einer Eigenschaft korrespondieren. Zum Beispiel (heh) kann ein Kreis seinen Radius in einer Instanzvariablen speichern und seinen Durchmesser und seine Fläche basierend auf diesem Radius berechnen. Alle drei sind noch Eigenschaften, aber nur der Radius wird in einer Instanzvariable gespeichert.

Einige Sprachen haben das Konzept von "First Class" -Eigenschaften. Dies bedeutet, dass die Eigenschaft für eine Clientanwendung wie eine Instanzvariable aussieht und verwendet wird. Das heißt, anstatt etwas wie circle.getDiameter() zu schreiben, würden Sie circle.diameter schreiben und statt circle.setRadius(5) würden Sie circle.radius = 5 schreiben.

    
Adam Jaskiewicz 01.05.2009 14:22
quelle
0

Im Gegensatz zu den anderen gegebenen Antworten denke ich , dass es eine nützliche Unterscheidung zwischen Elementvariablen und Eigenschaften gibt, die sprachunabhängig ist.

Die Unterscheidung wird am deutlichsten bei der komponentenorientierten Programmierung, die überall nützlich ist, aber am einfachsten in einer grafischen Benutzeroberfläche zu verstehen ist. In diesem Zusammenhang tendiere ich dazu, an die Design-Time-Konfiguration einer Komponente als Manipulation der "Eigenschaften" eines Objekts zu denken. Zum Beispiel wähle ich die Vordergrund- und Hintergrundfarben, den Rahmenstil und die Schriftart eines Texteingabefelds, indem ich seine Eigenschaften festlege. Während diese Eigenschaften zur Laufzeit geändert werden können, sind sie dies normalerweise nicht. Zur Laufzeit wird eine andere Gruppe von Variablen, die den Inhalt des Feldes repräsentieren, viel wahrscheinlicher gelesen und geschrieben. Ich halte diese Information für den "Zustand" der Komponente.

Warum ist diese Unterscheidung nützlich? Beim Erstellen einer Abstraktion für die Verdrahtung von Komponenten müssen normalerweise nur die "state" -Variablen offengelegt werden. Wenn Sie zum Textfeldbeispiel zurückkehren, können Sie eine Schnittstelle angeben, die Zugriff auf den aktuellen Inhalt bietet. Aber die "Eigenschaften", die das Aussehen der Komponente steuern, sind nur in einer konkreten Implementierungsklasse definiert.

    
erickson 01.05.2009 17:06
quelle