2015-01-13 27 views
5

La mia domanda riguarda le proprietà in haxe. Se ho capito bene, se faccio una proprietà come questa var propertyInt(get, set):Int; secondo la documentazione di haxe non è davvero una variabile. Ma posso renderlo una variabile modificandolo in questo modo @:isVar var propertyInt(get, set):Int;. In caso contrario, ho bisogno di fare due metodi:Proprietà Haxe - getter e setter contro @: isVar

function get_propertyInt() 
    return propertyInt; 

function set_properyInt(i) 
    return propertyInt = i; 

Quindi la mia domanda è: cosa importa se sto utilizzando esclusivamente @:isVar var propertyInt(get, set):Int;? Ad esempio, ho più di 5 proprietà nella mia classe e, come potete immaginare, fare questo metodo per ogni proprietà potrebbe essere un enorme dolore nella parte posteriore. Quindi qual è l'approccio migliore?

risposta

10

Ecco cosa documentation ha da dire sulle proprietà fisiche (noto anche come campi backing):

Un campo è considerato fisico se è o

  • variabile
  • una proprietà con l'identificativo di accesso in lettura o in scrittura pari a default o null
  • una proprietà con :isVar metadati

Così si può impostare una proprietà che si compone interamente di valori calcolati. Pensa a una proprietà di sola lettura che ti dà l'area di un rettangolo come una funzione di larghezza e altezza, oppure pensa a una proprietà che è supportata da qualche altra proprietà e restituisce/imposta larghezza e altezza in una diversa unità. O forse vuoi solo nominare i tuoi campi di supporto in modo diverso, ad esempio m_width e m_height.

Il :isVar è utile in situazioni in cui le regole di accesso alla proprietà ecc. Di cui sopra consentirebbero al compilatore di pensare che non sia necessario alcun campo di supporto. In tal caso, il codice fallirebbe (dalla documentazione di nuovo):

// 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; 
    } 

Aggiungendo :isVar che, fondamentalmente, dire al compilatore che si desidera assolutamente il campo di supporto. L'altra opzione per il caso particolare sarebbe usare default,default, nel qual caso il compilatore sa che c'è un campo di supporto automatica richiesta e accesso deve essere limitato a seconda del livello di accesso della struttura (public o private):

public var propertyInt(default, default):Int; 

in questo caso si potrebbe anche utilizzare una variabile direttamente, perché l'effetto netto è in sostanza la stessa:

public var propertyInt : Int; 
+0

Grazie mille per la risposta molto appagante. Lo metterò a frutto. Sono ancora confuso, salgo da C# e sto iniziando lentamente a capire tutte le caratteristiche di haxe. Grazie mille! :) –

+0

Raccomando anche di cercare il significato di 'private' in Haxe - è diverso rispetto a C# :-) – JensG

+0

Ho notato che il privato ha funzionalità di protezione. Perché ? È un po 'fastidioso. C'è qualche spiegazione ragionevole per questo comportamento? Odio anche la mancanza della classica funzionalità 'for' loop ... –