Основы Dart 2.x (Классы и объекты)

03.10.2019
Статья написана для старой версии Flutter и сейчас обновляется. Часть кода может не компилироваться на актуальной версии.
  • Dart является объектно-ориентированным языком, но в нем присутствуют некоторые отличия данной парадигмы от Java\C#.
  • Dart нет специальных ключевых слов (public; private; protected) то есть спецификаторов доступа, по этому все идентификаторы «публичны» по умолчанию. Вопрос инкапсуляции решен соглашением: приватными считаются все члены класса, чье имя начинается с подчеркивания " ".
String _name = "TOYOTA"; // Приватное поле name

Классы и объекты

ООП - парадигма программирования, в которой основными концепциями являются понятия объектов и классов. Объект — это сущность (экземпляр класса), которой можно посылать сообщения и которая может на них реагировать, используя свои данные. Объект может обладать двумя основными характеристиками: состояние - некоторые данные которые хранит объект (поля или переменные класса), и поведение - действия, которые может совершать объект (методы). Пример программы на Dart:

void main (){ //Метод main, точка входа в программу Dart
    ToyotaCars corolla = ToyotaCars(); // Создание объекта corolla класса ToyotaCars
    // Изменяем данные объекта corolla
    corolla.color = "Black";
    corolla.vin_code = 236478;
    // Вызов метода display() (тоесть происходит некое действие объекта corolla)
    corolla.display();
}
 class ToyotaCars{
    String color; // Поле класса
    int vin_code; // Ещё одно поле класса
    void display(); { // Метод, который можно вызвать с помощью объекта данного класса
        print("Color: $color VIN_CODE: $vin_code"); // Знак $ это интерполяция
    }
}

Конструкторы

Кроме обычных методов, классы могут определять специальные методы, которые называются конструкторами . Конструкторы вызываются при создании нового объекта данного класса. Конструкторы выполняют инициализацию объекта. Разберем 2-ю строчку кода:

ToyotaCars corolla = ToyotaCars();

Самое первое мы пишем имя класса ToyotaCars , далее имя создаваемого объекта corolla и через оператор присвоения (=) метод без параметров ToyotaCars() - он же и есть наш конструктор, который выполнить инициализацию нашего объекта corolla .

Конструктор с параметрами

Если необходимо что бы при создании объекта поля класса получали какие-то определенные значения тогда используется конструктор с параметрами:

void main (){
    ToyotaCars auris = ToyotaCars("Yellow", 234453); //Определяем значения переменных
    auris.display();
   }
 class ToyotaCars{
    String color;
    int vin_code;
    ToyotaCars(String с, int v) //Определяем конструктор с параметрами
    {
        color = с;
        vin_code = v;
    }
    void display(){
        print("Color: $color VIN_CODE: $vin_code");
    }
}

Ключевое слово this - всегда служит ссылкой на объект, для которого был вызван метод. Ключевое слово this можно использовать везде, где допускается ссылка на объект типа текущего класса. Пример:

class ToyotaCars{
    String color;
    int vin_code;
    ToyotaCars(String color, int vin_code)
    {
        this.color = color;
        this.vin_code = vin_code;
    }

Либо с помощью this , мы можем сократить определение конструктора:

class ToyotaCars{
    String color;
    int vin_code;
    ToyotaCars(this.color, this.vin_code);
    void display(){
        print("Color: $color VIN_CODE: $vin_code");
    }
}

Именованные конструкторы

По умолчанию мы можем определить только один общий конструктор. Если же нам необходимо использовать в классе сразу несколько конструкторов, тогда необходимо применять именованные конструкторы , это выглядит как дополнительное имя конструктору, через точку от имени класса. Например:

void main (){
    ToyotaCars corolla = ToyotaCars.corolla_only(); // Именованный конструктор.
    corolla.display();
    ToyotaCars auris = ToyotaCars.for_auris("Green", 334658); // Второй именованный конст.
    auris.display();
}
 class ToyotaCars{
    String color;
    int vin_code;
    ToyotaCars.corolla_only(){
        color = "Black";
        vin_code = 784643;
    }
    ToyotaCars.for_auris(String c, int v){
        color = c;
        vin_code = v;
    }
    void display(){
        print("Color: $color VIN_CODE: $vin_code");
    }
}