2015-01-13 7 views
5

Meine Frage bezieht sich auf Eigenschaften in haxe. Wenn ich es richtig verstehe, wenn ich Eigenschaft wie diese var propertyInt(get, set):Int; entsprechend der haxe Dokumentation mache, ist es nicht wirklich eine Variable. Aber ich kann es zu einer Variable machen, indem ich es so modifiziere @:isVar var propertyInt(get, set):Int;. Ansonsten muss ich zwei Methoden machen:Haxe Eigenschaft - Getter und Setter versus @: isVar

function get_propertyInt() 
    return propertyInt; 

function set_properyInt(i) 
    return propertyInt = i; 

Also meine Frage ist: Ist es egal, ob ich ausschließlich @:isVar var propertyInt(get, set):Int; bin mit? Zum Beispiel habe ich mehr als 5 Eigenschaften in meiner Klasse und wie Sie sich vorstellen können, diese Methoden für jede Eigenschaft zu machen, könnte im hinteren Bereich große Schmerzen sein. Was ist der beste Ansatz?

Antwort

10

Hier ist, was die documentation über physikalische Eigenschaften zu sagen hat (auch als Trägerfelder bekannt):

Ein Feld physikalische angesehen wird, wenn es entweder

  • variable
  • eine Eigenschaft mit dem Lesezugriff oder Schreibzugriffskennung ist default oder null
  • eine Eigenschaft mit :isVar Metadaten

So können Sie eine Eigenschaft einrichten, die vollständig von berechneten Werten besteht. Stellen Sie sich eine schreibgeschützte Eigenschaft vor, die Ihnen die Fläche eines Rechtecks ​​als Funktion der Breite und Höhe angibt, oder denken Sie an eine Eigenschaft, die von einer anderen Eigenschaft unterstützt wird und Breite und Höhe nur in einer anderen Einheit zurückgibt. Oder vielleicht möchten Sie einfach Ihre Backing-Felder anders benennen, zum Beispiel m_width und m_height.

Die :isVar ist hilfreich in Situationen, in denen die oben beschriebenen Eigenschaftszugriffsregeln usw. den Compiler denken ließen, dass kein Unterstützungsfeld benötigt wird. In diesem Fall wäre es nicht mehr der Code (aus der Dokumentation wieder):

// This field cannot be accessed because it 
    // is not a real variable 
    public var x(get, set):Int; 

    function get_x() { 
    return x; 
    } 

    function set_x(x) { 
    return this.x = x; 
    } 

von :isVar Zugabe Sie sagen, im Grunde den Compiler, die Sie unbedingt das dahinter liegenden Feld wollen. Die andere Option für Ihren speziellen Fall wäre default,default zu verwenden, wobei in diesem Fall der Compiler weiß, gibt es eine automatische Unterstützung Bereich erforderlich und Zugang sollte entsprechend der Zugriffsebene der Eigenschaft eingeschränkt werden (public oder private):

public var propertyInt(default, default):Int; 

in diesem Fall könnten Sie auch eine Variable direkt verwendet werden, da der Nettoeffekt ist im Wesentlichen das gleiche:

public var propertyInt : Int; 
+0

viel Dank für das sehr erfüllend Antwort. Ich werde es gut gebrauchen. Ich bin immer noch etwas verwirrt, ich springe von C# und ich beginne langsam alle Funktionen zu verstehen. Vielen Dank ! :) –

+0

Ich empfehle auch, die Bedeutung von 'privat' in Haxe nachzuschlagen - es ist anders im Vergleich zu C# :-) – JensG

+0

Ich bemerkte, dass private Funktionen von geschützt hat. Warum das ? Es nervt ein wenig. Gibt es eine vernünftige Erklärung für dieses Verhalten? Außerdem hasse ich das Fehlen der klassischen For-Schleife-Funktionalität ... –