2013-07-05 6 views
8

Voglio creare una variabile privata ma non posso.Come in Dart creare una variabile privata?

Ecco il mio codice:

void main() { 
    var b = new B(); 
    b.testB();  
} 

class A { 
    int _private = 0; 

    testA() { 
    print('int value: $_private'); 
    _private = 5; 
    } 
} 

class B extends A { 
    String _private; 

    testB() { 
    _private = 'Hello'; 
    print('Srting value: $_private'); 
    testA(); 
    print('Srting value: $_private'); 
    } 
} 

Quando ho eseguito questo codice, ottengo il seguente risultato:

Srting value: Hello 
int value: Hello 
Breaking on exception: type 'int' is not a subtype of type 'String' of 'value'. 

Inoltre non c'è niente di errori o avvisi durante la modifica di questo codice sorgente.

Come posso creare una variabile privata in Dart?

risposta

15

Da documentazione Dart:

A differenza di Java, Dart non ha le parole chiave pubbliche, protette e private. Se un identificatore inizia con un trattino basso _, è privato della sua libreria.

Le librerie non forniscono solo API, ma sono un'unità di privacy: gli identificatori che iniziano con un trattino di sottolineatura _ sono visibili solo all'interno della libreria.

+0

Ho ragione nel ritenere che un file si riferisca ad un modulo per il linguaggio Dart? Che dire di ** parte ** - s? Un modulo è in realtà la raccolta di file come una "parte di" una libreria? – will

7

La privacy in Dart esiste nella libreria, piuttosto che nel livello di classe.

Se si dovesse mettere classe A in un file di libreria separata (ad esempio, other.dart), come ad esempio:

library other; 

class A { 
    int _private = 0; 

    testA() { 
    print('int value: $_private'); // 0 
    _private = 5; 
    print('int value: $_private'); // 5 
    } 
} 

e quindi importarlo nella vostra applicazione principale, come ad esempio:

import 'other.dart'; 

void main() { 
    var b = new B(); 
    b.testB();  
} 


class B extends A { 
    String _private; 

    testB() { 
    _private = 'Hello'; 
    print('String value: $_private'); // Hello 
    testA(); 
    print('String value: $_private'); // Hello 
    } 
} 

È possibile ottenere i risultati attesi:

String value: Hello 
int value: 0 
int value: 0 
String value: Hello 
+5

Sholudn't essere: * Ciao, 0, 5, Ciao *? (5 non 0) – KajMagnus