betacode

Свойства в Dart

  1. Что такое ​​​​​​​Property?
  2. Getter
  3. Setter
  4. Examples

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