Свойства в Dart
1. Что такое Property?
Прежде чем дать определение "Что такое Property?" нам нужно уточнить "Что такое поле (field)?".
Поле (field) - это переменная, объявленная непосредственно в классе.
Смотрите статью о constructor, чтобы понять, как Dart присваивает полям значения:
- Dart Constructors
В языке Dart все поля класса доступны из-за пределов класса. Вы можете получить их значения и установить для них новые значения. Например:
field_ex1.dart
class Person {
String name;
String gender;
String? country; // Allow null value.
Person(this.name, this.gender, this.country); // Constructor
Person.nameAndGender(this.name, this.gender); // Constructor
// Method:
void selfIntroduce() {
if (country != null) {
print('Hi, My name is $name, from $country');
} else {
print('Hi, My name is $name');
}
}
}
void main() {
Person emma = new Person('Emma', 'Female', 'USA'); // Create an object
emma.selfIntroduce(); // Call method.
var name = emma.name; // get the value of a field
print('emma.name: $name');
print('emma.gender: ${emma.gender}');
print('emma.country: ${emma.country}');
print(' --- Set new value to country field ---: ');
emma.country = 'Canada'; // set new value to a field
print('emma.country: ${emma.country}');
}
Output:
Hi, My name is Emma, from USA
emma.name: Emma
emma.gender: Female
emma.country: USA
--- Set new value to country field ---:
emma.country: Canada
Private Field?
В отличие от Java, Dart не предоставляет ключевые слова private, protected и public. Если вам нужно private field, вы должны назвать поле, начинающееся с символа подчеркивания ( _ ). Например _fieldName.
Поля с именами, начинающимися с символа подчеркивания (_), неявно являются private ( приватными), они используются библиотекой внутри. Это просто неявное соглашение, программисты, использующие библиотеку, не должны получать доступ к этим полям извне, поскольку это противоречит идее проектирования библиотеки. Намеренный доступ к этим полям извне может привести к неожиданным ошибкам.
Property?
В принципе, как только вы доберетесь до какого-либо поля, вы сможете получить его значение и присвоить ему новое значение.
Property - это понятие, аналогичное полю (field), однако оно имеет больше особенностей. Property делится на 3 типа:
- Read-only Property: Разрешает доступ к его значению, но не позволяет устанавливать для него новые значения.
- Write-only Property:Позволяет задать для него новое значение, но не разрешает доступ к его значению.
- Read/Write Property:Разрешает доступ к значению и позволяет установить для него новое значение.
Согласно дизайнерской идее Dart, вы должны назвать все поля в своем классе, начиная с символа подчеркивания (_), это означает, что они используются только внутренние библиотеки и используют property для замены роли полей в общении с внешним миром.
2. Getter
Синтаксис Getter позволяет определить property вне класса, которое может получить доступ к его значению, но не может установить для него новое значение, если вы также не определите Setter для этого property.
data_type get property_name {
// code ...
return a_value;
}
Например, класс Person ниже разрешает доступ к значению of property name, но не позволяет изменять его значение извне.
property_getter_ex1.dart
class Person {
String _name; // private field
String gender;
String? _country; // private field
Person(this._name, this.gender, this._country); // Constructor
Person.nameAndGender(this._name, this.gender); // Constructor
// Getter
String get name {
return _name;
}
// Getter
String get country {
return _country ?? '[Not Provided]';
}
// Method:
void selfIntroduce() {
if (_country != null) {
print('Hi, My name is $name, from $country');
} else {
print('Hi, My name is $name');
}
}
}
void main() {
var emma = Person.nameAndGender('Emma', 'Female'); // Create an object
emma.selfIntroduce(); // Call method.
var name = emma.name; // get the value of a property
var country = emma.country; // get the value of a property
print('emma.name: $name');
print('emma.country: $country');
// Can not set new value to property - name
// emma.name = 'New Name'; // ERROR!!
}
Output:
Hi, My name is Emma
emma.name: Emma
emma.country: [Not Provided]
3. Setter
Синтаксис Setter позволяет определить property, которое позволяет задать для него новое значение, но не разрешает доступ к его значению, если вы также не определили Getter для этого свойства.
set property_name(data_type newValue) {
// code
}
Например:
property_setter_ex1.dart
class Person {
String name;
String gender;
String _country; // private field
Person(this.name, this.gender, this._country); // Constructor
// Setter
set country(String newCountry) {
_country = newCountry;
}
// Method:
void selfIntroduce() {
print('Hi, My name is $name, from $_country');
}
}
void main() {
var emma = Person('Emma', 'Female', 'USA'); // Create an object
emma.selfIntroduce(); // Call method.
// Set new value to country property.
emma.country = 'Canada';
emma.selfIntroduce();
// Can not get the value of country property
// var country = emma.country; // ERROR!!
}
Output:
Hi, My name is Emma, from USA
Hi, My name is Emma, from Canada
4. Examples
Например: property как с Getter, так и с Setter:
property_gettersetter_ex1.dart
class Person {
String name;
String gender;
String? _country; // private field
Person(this.name, this.gender, this._country); // Constructor
Person.nameAndGender(this.name, this.gender); // Constructor
// Getter
String get country {
return _country ?? '[Not Provided]';
}
// Setter
set country(String newCountry) {
_country = newCountry;
}
// Method:
void selfIntroduce() {
if(_country != null) {
print('Hi, My name is $name, from $_country');
} else {
print('Hi, My name is $name');
}
}
}
void main() {
var emma = Person.nameAndGender('Emma', 'Female'); // Create an object
emma.selfIntroduce(); // Call method.
var country = emma.country;
print('Country: $country');
print(' --- set new value to country property ---');
emma.country = 'Canada'; // Set new value to country property.
emma.selfIntroduce();
}
Output:
Hi, My name is Emma
emma.country: [Not Provided]
--- set new value to country property ---
Hi, My name is Emma, from Canada
Pуководства Dart
- Тип данных Boolean в Dart
- Функции в Dart
- Замыкания (Closure) в Dart
- Методы в Dart
- Свойства в Dart
- Оператор точка-точка (..) в Dart
- Программирование Dart с помощью онлайн-инструмента DartPad
- Установите Dart SDK в Windows
- Установите Visual Studio Code в Windows
- Установите Dart Code Extension для Visual Studio Code
- Установите Dart Plugin для Android Studio
- Запустите свой первый пример Dart в Visual Studio Code
- Запустите свой первый пример Dart в Android Studio
- Dart JSON với thư viện dart:convert
- Руководство Dart List
- Переменные в Dart
- Руководство Dart Map
- Циклы в Dart
Show More