4 tính chất của hướng đối tượng trong Dart?
##4 tính chất của OOP
###Tính kế thừa
// base (parent) class
class Parent {
// some props
// some methods
}
// derived (child) class
class Child extends Parent {
}
##Các loại kế thừa
Đơn kế thừa:
// base class
class Parent {
// some props
// some methods
}
// derived class
class Child extends Parent {
}
Đa kế thừa:
Kế thừa đa cấp
// base class
class Parent {
// some props
// some methods
}
// derived class
class Child extends Parent {
}
// GrandChild is derived from Child,
// which is derived from another
// class (Parent)
class GrandChild extends Child {
}
##‹ Kế thừa phân cấp
Nhiều class
con kế thừa cùng một class
cha
// base class
class Parent {
// some props
// some methods
}
// derived class
class Child1 extends Parent {
}
class Child2 extends Parent {
}
Lưu ý
class
con chỉ kế thừa các thuộc tính và phương thức củaclass
cha, không kế thừa constructor củaclass
cha- Dart không hỗ trợ đa kế thừa
Từ khóa super
Lợi ích của super
- Truy cập đến các data member của class cha để phân biệt với data member của class con
- Tránh ghi đè lên phương thức của class cha
- Dùng để gọi các parameterized constructor của class cha
class Person {
late String name;
late int age;
Person(this.name, this.age);
void printInfo() {
print(this.name);
print(this.age);
}
}
class Student extends Person {
late int id;
Student(String name, int age, int id)
: this.id = id,
super(name, age); // đến parameterized constructor của class cha
@override
void printInfo() {
super.printInfo();
print(this.id);
}
}
void main() {
var newPerson = new Person("Hung", 20);
var newStudent = new Student("Hung", 21, 11);
newPerson.printInfo();
print("--------------");
newStudent.printInfo();
}
Tính đóng gói
class User {
String name; // đây là thành phần public
String _username; // đây là thành phần private
String _password;
User(this.name, this._username, this._password);
}
- Khi class User và main đặt trong cùng một file.
class User {
String name;
String _username;
String _password;
User(this.name, this._username, this._password);
void _hashPassword() {
print("password hashed >.<");
}
}
void main() {
var newUser = new User("Hung", "admin", "admin");
newUser._username = "adminLOL"; // legal
newUser._password = "adminLOL"; // legal
newUser._hashPassword();
}
Khi class User được đặt trong file user.dart và import vào file main.dart
// user.dart
class User {
String name;
String _username;
String _password;
User(this.name, this._username, this._password);
void _hashPassword() {
print("password hashed >.<");
}
}
import 'user.dart';
void main() {
var newUser = new User("Hung", "admin", "admin");
newUser._username = "adminLOL"; // illegal
newUser._password = "adminLOL"; // illegal
newUser._hashPassword(); // illegal
}
##Tính đa hình
class User {
void printInfo() {
print("This is a new User!");
}
}
class Student extends User {
@override
void printInfo() {
print("This is not just an user, but a student as well");
}
}
void main() {
var newUser = new User();
newUser.printInfo(); // output: This is a new user!
var newStudent = new Student();
newStudent.printInfo(); // output: This is not just an user, but a student as well
}
###Lưu ý
##Tính trừu tượng
Lớp trừu tượng (abtract class
)
abstract class Animal {
// define constructor and fields
int _hands;
String _type;
String _name;
int _children = 0;
Animal(this._name, this._type, this._hands);
void setName(String name);
}
class Dog extends Animal {
Dog(String name, String type, int hands) : super(name, type, hands);
void setChildren(int nChild) {
this._children = nChild;
}
}
##Interface
class Person {
final String _name; // in the interface
Person(this._name); // Not in the interface, since this is a constructor.
// In the interface.
String greet(String who) => 'Hello, $who. I am $_name.';
}
class Impostor implements Person {
String get _name => '';
String greet(String who) => 'Hi $who. Do you know who I am?';
}
String greetBob(Person person) => person.greet('Bob');
void main() {
print(greetBob(Person('Kathy')));
print(greetBob(Impostor()));
}
##Mixin
class Animal {}
class Mammal extends Animal{}
class Bird extends Animal{}
class Fish extends Animal {}
mixin Flyer {
double? maxHeight;
void fly() {
print("Flies at $maxHeight");
}
}
mixin Swimmer {
double? maxDepth;
void swim() {
print("Swims at $maxDepth");
}
}
mixin Walker on Mammal, Bird{
//...
}
class Dolphin extends Mammal with Swimmer {
Dolphin() {
this.maxDepth = 100;
this.swim();
}
}
class Bat extends Mammal with Flyer {
Bat() {
this.maxHeight = 200;
this.fly();
}
}
class Duck extends Bird with Swimmer, Flyer , Walker{
}
Để thảo luận về các vấn đề trong bài viết này, mời các bạn tham gia nhóm facebook https://fb.com/groups/divindev/