##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 {
  
}

Untitled

Đa kế thừa:

Untitled

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 {
  
}

Untitled

##‹ 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 {
  
}

Untitled

Lưu ý

  • class con chỉ kế thừa các thuộc tính và phương thức của class cha, không kế thừa constructor của class 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 ý

Untitled

##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

Untitled

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{
  
}