Antwort

17

Iain, das ist im Grunde eine Terminologie Frage und ist trotz des „sprachunabhängig“ Tag mit dieser Frage verbunden ist, sehr Sprache/Umwelt.

Für 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 es um eine bestimmte Sprache geht, können sich diese beiden unterscheiden. In C# ist eine Eigenschaft beispielsweise eine Funktion, die ein Objekt zurückgibt, während eine Instanzvariable eine nicht statische Membervariable einer Klasse ist.

+1

+1: Es ist definitiv sprachbezogen. – Powerlord

+0

ja, arm java .... hat noch keine Eigenschaften :( –

2

Codebeispiel in C# getan

public class ClassName 
{ 
    private string variable; 

    public string property 
    { 
     get{ return variable; } 
     set { variable = value; } 
    } 
} 
0

Zusätzlich zu dem, was gesagt wurde, in einer Sprache wie C#, 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.

1

Vielleicht ist das, weil Sie zuerst aus C++ kamen, richtig ?! 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. Ob sie Instanzmitglieder sind (oder wie Sie es Instanzvariable genannt haben) oder Klassenmitglieder ....

Prost!

1

Eine Eigenschaft kann, und ich nehme an, meistens eine Instanzvariable zurückgeben, 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.

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 der "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.

3

Hershi hat Recht, sprachspezifisch zu sein. Aber um den Spuren der sprachspezifischen Antworten hinzuzufügen:

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 Mitgliedern oder Instanzvariablen in Java, außer dass alles öffentlich ist.

Eigenschaften sind Verknüpfungen zu Getter/Setter-Methoden, die genauso aussehen wie eine Instanzvariable. Somit wird in der folgenden Klassendefinition (modifiziert von Guido new style object manifesto):

class C(object): 

    def __init__(self): 
     self.y = 0 

    def getx(self): 
     if self.y < 0: return 0 
     else: return self.y 

    def setx(self, x): 
     self.y = x 

    x = property(getx, setx) 

>>> z = C() 
>>> z.x = -3 
>>> print z.x 
0 
>>> print z.y 
-3 
>>> z.x = 5 
>>> print z.x 
5 
>>> print z.y 
5 

y ist eine Instanzvariable des z ist x 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 -Programmierung).

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.

0

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

Die Unterscheidung ist 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 in der Regel 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 offen gelegt 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.

2

In Ziel c ist eine Eigenschaft eine Instanzvariable, die den Vorteil eines überladenen Punktoperators zum Aufruf von Setter und Getter nutzen kann. 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.