Lập trình Dart - Lớp học
Dart là một ngôn ngữ hướng đối tượng. Nó hỗ trợ các tính năng lập trình hướng đối tượng như lớp, giao diện, v.v. Aclassvề mặt OOP là một bản thiết kế để tạo ra các đối tượng. Aclassđóng gói dữ liệu cho đối tượng. Dart cung cấp hỗ trợ tích hợp cho khái niệm này được gọi làclass.
Khai báo một lớp
Sử dụng class từ khóa để khai báo một classtrong Dart. Một định nghĩa lớp bắt đầu với lớp từ khóa theo sau làclass name; và phần thân của lớp được bao bởi một cặp dấu ngoặc nhọn. Cú pháp tương tự được đưa ra dưới đây:
Cú pháp
class class_name {
<fields>
<getters/setters>
<constructors>
<functions>
}
Các classtheo sau từ khóa là tên lớp. Các quy tắc cho định danh phải được xem xét trong khi đặt tên một lớp.
Một định nghĩa lớp có thể bao gồm những điều sau:
Fields- Trường là bất kỳ biến nào được khai báo trong một lớp. Các trường đại diện cho dữ liệu liên quan đến các đối tượng.
Setters and Getters- Cho phép chương trình khởi tạo và lấy giá trị của các trường của một lớp. Một getter / setter mặc định được liên kết với mọi lớp. Tuy nhiên, những cái mặc định có thể bị ghi đè bằng cách xác định rõ ràng một setter / getter.
Constructors - chịu trách nhiệm cấp phát bộ nhớ cho các đối tượng của lớp.
Functions- Hàm thể hiện các hành động mà một đối tượng có thể thực hiện. Đôi khi chúng cũng được gọi là phương pháp.
Các thành phần này kết hợp với nhau được gọi là data members của lớp.
Ví dụ: Khai báo một lớp
class Car {
// field
String engine = "E1001";
// function
void disp() {
print(engine);
}
}
Ví dụ khai báo một lớp Car. Lớp có một trường tênengine. Cácdisp() là một hàm đơn giản in ra giá trị của trường engine.
Tạo phiên bản của lớp
Để tạo một phiên bản của lớp, hãy sử dụng newtừ khóa theo sau là tên lớp. Cú pháp tương tự được đưa ra dưới đây:
Cú pháp
var object_name = new class_name([ arguments ])
Các new từ khóa chịu trách nhiệm cho việc khởi tạo.
Phía bên phải của biểu thức gọi hàm tạo. Hàm tạo phải được truyền các giá trị nếu nó được tham số hóa.
Ví dụ: Khởi tạo một lớp
var obj = new Car("Engine 1")
Truy cập thuộc tính và chức năng
Các thuộc tính và chức năng của một lớp có thể được truy cập thông qua đối tượng. Sử dụng '.' ký hiệu dấu chấm (được gọi làperiod) để truy cập các thành viên dữ liệu của một lớp.
//accessing an attribute
obj.field_name
//accessing a function
obj.function_name()
Thí dụ
Hãy xem ví dụ sau để hiểu cách truy cập các thuộc tính và chức năng trong Dart -
void main() {
Car c= new Car();
c.disp();
}
class Car {
// field
String engine = "E1001";
// function
void disp() {
print(engine);
}
}
Các output của đoạn mã trên như sau:
E1001
Máy tạo phi tiêu
Hàm tạo là một hàm đặc biệt của lớp có nhiệm vụ khởi tạo các biến của lớp. Dart định nghĩa một phương thức khởi tạo có cùng tên với tên của lớp. Hàm tạo là một hàm và do đó có thể được tham số hóa. Tuy nhiên, không giống như một hàm, các hàm tạo không thể có kiểu trả về. Nếu bạn không khai báo hàm tạo, mặc địnhno-argument constructor được cung cấp cho bạn.
Cú pháp
Class_name(parameter_list) {
//constructor body
}
Thí dụ
Ví dụ sau đây cho thấy cách sử dụng các hàm tạo trong Dart:
void main() {
Car c = new Car('E1001');
}
class Car {
Car(String engine) {
print(engine);
}
}
Nó sẽ tạo ra những thứ sau output -
E1001
Trình tạo được đặt tên
Dart cung cấp named constructors để cho phép xác định một lớp multiple constructors. Cú pháp của các hàm tạo được đặt tên như dưới đây:
Cú pháp: Định nghĩa hàm tạo
Class_name.constructor_name(param_list)
Thí dụ
Ví dụ sau đây cho thấy cách bạn có thể sử dụng các hàm tạo được đặt tên trong 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}");
}
}
Nó sẽ tạo ra những thứ sau output -
The engine is : E1001
Non-parameterized constructor invoked
Từ khoá này
Các thistừ khóa đề cập đến phiên bản hiện tại của lớp. Ở đây, tên tham số và tên trường của lớp giống nhau. Do đó, để tránh sự mơ hồ, trường của lớp được bắt đầu bằngthistừ khóa. Ví dụ sau giải thích tương tự -
Thí dụ
Ví dụ sau giải thích cách sử dụng this từ khóa trong Dart -
void main() {
Car c1 = new Car('E1001');
}
class Car {
String engine;
Car(String engine) {
this.engine = engine;
print("The engine is : ${engine}");
}
}
Nó sẽ tạo ra những thứ sau output -
The engine is : E1001
Dart Class ─ Getters and Setters
Getters và Setters, còn được gọi là accessors và mutators, cho phép chương trình khởi tạo và lấy giá trị của các trường lớp tương ứng. Người nhận hoặc người truy cập được xác định bằng cách sử dụnggettừ khóa. Bộ định hình hoặc bộ đột biến được xác định bằng cách sử dụngset từ khóa.
Một getter / setter mặc định được liên kết với mọi lớp. Tuy nhiên, những cái mặc định có thể bị ghi đè bằng cách xác định rõ ràng một setter / getter. Một getter không có tham số và trả về một giá trị, và setter có một tham số và không trả về giá trị.
Cú pháp: Định nghĩa một getter
Return_type get identifier
{
}
Cú pháp: Định nghĩa một bộ định giá
set identifier
{
}
Thí dụ
Ví dụ sau cho thấy cách bạn có thể sử dụng getters và setters trong một lớp học 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);
}
Mã chương trình này sẽ tạo ra như sau output -
Age should be greater than 5
MARK
Null
Kế thừa giai cấp
Dart ủng hộ khái niệm Kế thừa là khả năng của một chương trình để tạo các lớp mới từ một lớp hiện có. Lớp được mở rộng để tạo các lớp mới hơn được gọi là lớp cha / siêu lớp. Các lớp mới tạo được gọi là lớp con / lớp con.
Một lớp kế thừa từ một lớp khác bằng cách sử dụng từ khóa 'expand'. Child classes inherit all properties and methods except constructors from the parent class.
Cú pháp
class child_class_name extends parent_class_name
Note - Dart không hỗ trợ đa kế thừa.
Ví dụ: Kế thừa lớp
Trong ví dụ sau, chúng tôi đang khai báo một lớp Shape. Lớp học được mở rộng bởiCirclelớp học. Vì có mối quan hệ kế thừa giữa các lớp nên lớp con, tức là lớpCar nhận được quyền truy cập ngầm vào thành viên dữ liệu lớp cha của nó.
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 {}
Nó sẽ tạo ra những thứ sau output -
calling calc area defined in the Shape class
Các loại thừa kế
Kế thừa có thể thuộc ba loại sau:
Single - Mỗi lớp có thể mở rộng nhiều nhất từ một lớp cha.
Multiple- Một lớp có thể kế thừa từ nhiều lớp. Dart không hỗ trợ đa kế thừa.
Multi-level - Một lớp có thể kế thừa từ một lớp con khác.
Thí dụ
Ví dụ sau đây cho thấy cách hoạt động của kế thừa đa cấp:
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
Lớp Leaflấy các thuộc tính từ các lớp Root và Child nhờ kế thừa đa cấp. Nó làoutput như sau -
hello
Dart - Kế thừa Lớp và Ghi đè Phương pháp
Ghi đè phương thức là một cơ chế mà lớp con định nghĩa lại một phương thức trong lớp cha của nó. Ví dụ sau minh họa tương tự:
Thí dụ
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}");
}
}
Nó sẽ tạo ra những thứ sau output -
value of b 12
Số lượng và kiểu của các tham số hàm phải khớp trong khi ghi đè phương thức. Trong trường hợp số lượng tham số hoặc kiểu dữ liệu của chúng không khớp, trình biên dịch Dart sẽ thông báo lỗi. Hình minh họa sau đây giải thích tương tự -
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}");
}
}
Nó sẽ tạo ra những thứ sau output -
value of b 12
Từ khóa tĩnh
Các static từ khóa có thể được áp dụng cho các thành viên dữ liệu của một lớp, tức là fields và methods. Một biến tĩnh vẫn giữ các giá trị của nó cho đến khi chương trình kết thúc quá trình thực thi. Các thành viên tĩnh được tham chiếu bởi tên lớp.
Thí dụ
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
}
Nó sẽ tạo ra những thứ sau output -
The value of num is 12
Từ khóa siêu cấp
Các supertừ khóa được sử dụng để tham chiếu đến lớp cha trực tiếp của một lớp. Từ khóa có thể được sử dụng để chỉ phiên bản siêu cấp của mộtvariable, property, hoặc là method. Ví dụ sau minh họa tương tự:
Thí dụ
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}") ;
}
}
Nó sẽ tạo ra những thứ sau output -
value of b 12
value of a 13
message variable from the parent class