Дарт это объектно-ориентированный язык. Он поддерживает функции объектно-ориентированного программирования, такие как классы, интерфейсы и т. Д. Класс с точки зрения ООП — это план создания объектов. Класс инкапсулирует данные для объекта. Дарт предоставляет встроенную поддержку этой концепции, называемой классом .
Объявление класса
Используйте ключевое слово 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.
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 —
void main() { Car c = new Car('E1001'); } class Car { Car(String engine) { print(engine); } }
Он должен произвести следующий вывод —
E1001
Именованные Конструкторы
Dart предоставляет именованные конструкторы, позволяющие классу определять несколько конструкторов . Синтаксис именованных конструкторов приведен ниже.
Синтаксис: определение конструктора
Class_name.constructor_name(param_list)
пример
В следующем примере показано, как вы можете использовать именованные конструкторы в Dart —
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 —
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 —
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, получает неявный доступ к своему члену данных родительского класса.
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 — каждый класс может быть максимально расширен от одного родительского класса.
Несколько — класс может наследоваться от нескольких классов. Дарт не поддерживает множественное наследование.
Многоуровневый — класс может наследовать от другого дочернего класса.
пример
В следующем примере показано, как работает многоуровневое наследование.
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 — наследование класса и переопределение метода
Переопределение метода — это механизм, с помощью которого дочерний класс переопределяет метод в своем родительском классе. Следующий пример иллюстрирует то же самое —
пример
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 выдает ошибку. Следующая иллюстрация объясняет то же самое —
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 может применяться к членам данных класса, т. Е. К полям и методам . Статическая переменная сохраняет свои значения, пока программа не завершит выполнение. На статические члены ссылается имя класса.
пример
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 используется для ссылки на непосредственного родителя класса. Ключевое слово может использоваться для ссылки на версию класса , свойства или метода суперкласса. Следующий пример иллюстрирует то же самое —
пример
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}") ; } }
Он должен произвести следующий вывод —