Учебники

Дартс Программирование — Занятия

Дарт это объектно-ориентированный язык. Он поддерживает функции объектно-ориентированного программирования, такие как классы, интерфейсы и т. Д. Класс с точки зрения ООП — это план создания объектов. Класс инкапсулирует данные для объекта. Дарт предоставляет встроенную поддержку этой концепции, называемой классом .

Объявление класса

Используйте ключевое слово class, чтобы объявить класс в Dart. Определение класса начинается с ключевого слова class, за которым следует имя класса ; и тело класса, заключенное в пару фигурных скобок. Синтаксис для того же приведен ниже —

Синтаксис

class class_name {  
   <fields> 
   <getters/setters> 
   <constructors> 
   <functions> 
}

Ключевое слово class сопровождается именем класса. Правила для идентификаторов должны учитываться при именовании класса.

Определение класса может включать следующее:

  • Поля . Поле — это любая переменная, объявленная в классе. Поля представляют данные, относящиеся к объектам.

  • Сеттеры и геттеры — позволяет программе инициализировать и извлекать значения полей класса. Получатель / установщик по умолчанию связан с каждым классом. Однако значения по умолчанию могут быть переопределены путем явного определения метода установки / получения.

  • Конструкторы — отвечают за выделение памяти для объектов класса.

  • Функции — функции представляют собой действия, которые может выполнять объект. Они также иногда упоминаются как методы.

Поля . Поле — это любая переменная, объявленная в классе. Поля представляют данные, относящиеся к объектам.

Сеттеры и геттеры — позволяет программе инициализировать и извлекать значения полей класса. Получатель / установщик по умолчанию связан с каждым классом. Однако значения по умолчанию могут быть переопределены путем явного определения метода установки / получения.

Конструкторы — отвечают за выделение памяти для объектов класса.

Функции — функции представляют собой действия, которые может выполнять объект. Они также иногда упоминаются как методы.

Эти компоненты, собранные вместе, называются членами данных класса.

Пример: объявление класса

class Car {  
   // field 
   String engine = "E1001";  
   
   // function 
   void disp() { 
      print(engine); 
   } 
}

В примере объявляется класс Car . У класса есть поле с именем engine . Disp () — это простая функция, которая печатает значение полевого механизма .

Создание экземпляра класса

Чтобы создать экземпляр класса, используйте ключевое слово new, за которым следует имя класса. Синтаксис для того же приведен ниже —

Синтаксис

var object_name = new class_name([ arguments ])
  • Новое ключевое слово отвечает за создание экземпляров.

  • Правая часть выражения вызывает конструктор. В конструктор должны быть переданы значения, если он параметризован.

Новое ключевое слово отвечает за создание экземпляров.

Правая часть выражения вызывает конструктор. В конструктор должны быть переданы значения, если он параметризован.

Пример: создание класса

var obj = new Car("Engine 1")

Доступ к атрибутам и функциям

Атрибуты и функции класса могут быть доступны через объект. Использовать ‘.’ точечная нотация (называемая точкой) для доступа к данным членов класса.

//accessing an attribute 
obj.field_name  

//accessing a function 
obj.function_name()

пример

Посмотрите на следующий пример, чтобы понять, как получить доступ к атрибутам и функциям в Dart.

Live Demo

void main() { 
   Car c= new Car(); 
   c.disp(); 
}  
class Car {  
   // field 
   String engine = "E1001";  
   
   // function 
   void disp() { 
      print(engine); 
   } 
}

Вывод вышеуказанного кода выглядит следующим образом:

E1001

Дротики конструкторы

Конструктор — это специальная функция класса, которая отвечает за инициализацию переменных класса. Дарт определяет конструктор с тем же именем, что и у класса. Конструктор является функцией и, следовательно, может быть параметризован. Однако, в отличие от функции, конструкторы не могут иметь возвращаемый тип. Если вы не объявляете конструктор, вам предоставляется конструктор по умолчанию без аргументов .

Синтаксис

Class_name(parameter_list) { 
   //constructor body 
}

пример

В следующем примере показано, как использовать конструкторы в Dart —

Live Demo

void main() { 
   Car c = new Car('E1001'); 
} 
class Car { 
   Car(String engine) { 
      print(engine); 
   } 
}

Он должен произвести следующий вывод

E1001 

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

Dart предоставляет именованные конструкторы, позволяющие классу определять несколько конструкторов . Синтаксис именованных конструкторов приведен ниже.

Синтаксис: определение конструктора

Class_name.constructor_name(param_list)

пример

В следующем примере показано, как вы можете использовать именованные конструкторы в Dart —

Live Demo

void main() {           
   Car c1 = new Car.namedConst('E1001');                                       
   Car c2 = new Car(); 
}           
class Car {                   
   Car() {                           
      print("Non-parameterized constructor invoked");
   }                                   
   Car.namedConst(String engine) { 
      print("The engine is : ${engine}");    
   }                               
}

Он должен произвести следующий вывод

The engine is : E1001 
Non-parameterized constructor invoked

Это ключевое слово

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

пример

В следующем примере объясняется, как использовать ключевое слово this в Dart —

Live Demo

void main() { 
   Car c1 = new Car('E1001'); 
}  
class Car { 
   String engine; 
   Car(String engine) { 
      this.engine = engine; 
      print("The engine is : ${engine}"); 
   } 
} 

Он должен произвести следующий вывод

The engine is : E1001

Класс дротиков ─ добытчики и сеттеры

Методы получения и установки, также называемые аксессорами и мутаторами , позволяют программе инициализировать и извлекать значения полей класса соответственно. Получатели или методы доступа определяются с помощью ключевого слова get . Сеттеры или мутаторы определяются с помощью ключевого слова set .

Получатель / установщик по умолчанию связан с каждым классом. Однако значения по умолчанию могут быть переопределены путем явного определения метода установки / получения. Получатель не имеет параметров и возвращает значение, а установщик имеет один параметр и не возвращает значение.

Синтаксис: определение геттера

Return_type  get identifier 
{ 
} 

Синтаксис: определение сеттера

set identifier 
{ 
}

пример

В следующем примере показано, как вы можете использовать геттеры и сеттеры в классе Dart —

Live Demo

class Student { 
   String name; 
   int age; 
    
   String get stud_name { 
      return name; 
   } 
    
   void set stud_name(String name) { 
      this.name = name; 
   } 
   
   void set stud_age(int age) { 
      if(age<= 0) { 
        print("Age should be greater than 5"); 
      }  else { 
         this.age = age; 
      } 
   } 
   
   int get stud_age { 
      return age;     
   } 
}  
void main() { 
   Student s1 = new Student(); 
   s1.stud_name = 'MARK'; 
   s1.stud_age = 0; 
   print(s1.stud_name); 
   print(s1.stud_age); 
} 

Этот программный код должен выдать следующий вывод:

Age should be greater than 5 
MARK 
Null 

Наследование классов

Дарт поддерживает концепцию наследования, которая заключается в способности программы создавать новые классы из существующего класса. Класс, расширенный для создания более новых классов, называется родительским классом / суперклассом. Вновь созданные классы называются дочерними / подклассами.

Класс наследуется от другого класса с помощью ключевого слова extends. Дочерние классы наследуют все свойства и методы, кроме конструкторов, от родительского класса .

Синтаксис

class child_class_name extends parent_class_name 

Примечание. Dart не поддерживает множественное наследование.

Пример: наследование классов

В следующем примере мы объявляем класс Shape . Класс расширен классом Circle . Поскольку между классами существуют отношения наследования, дочерний класс, т. Е. Класс Car, получает неявный доступ к своему члену данных родительского класса.

Live Demo

void main() { 
   var obj = new Circle(); 
   obj.cal_area(); 
}  
class Shape { 
   void cal_area() { 
      print("calling calc area defined in the Shape class"); 
   } 
}  
class Circle extends Shape {}

Он должен произвести следующий вывод

calling calc area defined in the Shape class

Типы Наследования

Наследование может быть следующих трех типов:

  • Single — каждый класс может быть максимально расширен от одного родительского класса.

  • Несколько — класс может наследоваться от нескольких классов. Дарт не поддерживает множественное наследование.

  • Многоуровневый — класс может наследовать от другого дочернего класса.

Single — каждый класс может быть максимально расширен от одного родительского класса.

Несколько — класс может наследоваться от нескольких классов. Дарт не поддерживает множественное наследование.

Многоуровневый — класс может наследовать от другого дочернего класса.

пример

В следующем примере показано, как работает многоуровневое наследование.

Live Demo

void main() { 
   var obj = new Leaf(); 
   obj.str = "hello"; 
   print(obj.str); 
}  
class Root { 
   String str; 
}  
class Child extends Root {}  
class Leaf extends Child {}  
//indirectly inherits from Root by virtue of inheritance

Класс Leaf извлекает атрибуты из классов Root и Child посредством многоуровневого наследования. Его вывод выглядит следующим образом —

hello

Dart — наследование класса и переопределение метода

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

пример

Live Demo

void main() { 
   Child c = new Child(); 
   c.m1(12); 
} 
class Parent { 
   void m1(int a){ print("value of a ${a}");} 
}  
class Child extends Parent { 
   @override 
   void m1(int b) { 
      print("value of b ${b}"); 
   } 
}

Он должен произвести следующий вывод

value of b 12

Число и тип параметров функции должны совпадать при переопределении метода. В случае несоответствия в количестве параметров или их типе данных компилятор Dart выдает ошибку. Следующая иллюстрация объясняет то же самое —

Live Demo

import 'dart:io'; 
void main() { 
   Child c = new Child(); 
   c.m1(12); 
} 
class Parent { 
   void m1(int a){ print("value of a ${a}");} 
} 
class Child extends Parent { 
   @override 
   void m1(String b) { 
      print("value of b ${b}");
   } 
}

Он должен произвести следующий вывод

value of b 12

Статическое ключевое слово

Ключевое слово static может применяться к членам данных класса, т. Е. К полям и методам . Статическая переменная сохраняет свои значения, пока программа не завершит выполнение. На статические члены ссылается имя класса.

пример

Live Demo

class StaticMem { 
   static int num;  
   static disp() { 
      print("The value of num is ${StaticMem.num}")  ; 
   } 
}  
void main() { 
   StaticMem.num = 12;  
   // initialize the static variable } 
   StaticMem.disp();   
   // invoke the static method 
}

Он должен произвести следующий вывод

The value of num is 12

Супер Ключевое слово

Ключевое слово super используется для ссылки на непосредственного родителя класса. Ключевое слово может использоваться для ссылки на версию класса , свойства или метода суперкласса. Следующий пример иллюстрирует то же самое —

пример

Live Demo

void main() { 
   Child c = new Child(); 
   c.m1(12); 
} 
class Parent { 
   String msg = "message variable from the parent class"; 
   void m1(int a){ print("value of a ${a}");} 
} 
class Child extends Parent { 
   @override 
   void m1(int b) { 
      print("value of b ${b}"); 
      super.m1(13); 
      print("${super.msg}")   ; 
   } 
}

Он должен произвести следующий вывод