openplanning

Interface trong Dart

  1. Interface Example 1
  2. Interface Example 2
  3. Interface Example 3

1. Interface Example 1

Interface là một khái niệm quan trọng trong các ngôn ngữ lập trình, nói một cách đơn giản, interface là một danh sách các phương thức mà một lớp nếu thi hành (implements) interface này cần phải có.
Trong ngôn ngữ lập trình Java, từ khoá interface được sử dụng để định nghĩa một interface. Ngôn ngữ Dart không có từ khoá interface. Tất cả các lớp trong Dart có thể được coi là một interface một cách ngầm định (implicitly).
Để đơn giản hãy xem tình huống sau:
interface_ex1.dart - (Part 1 of 3)
abstract class Aa {
   void silent();
}
abstract class Bb1 extends Aa {
   void sayHello(String name)  {
      print("From Bb1, hello $name");
   }
}
// ...
  • Lớp Aa có một phương thức.
  • Lớp Bb1 định nghĩa một phương thức của riêng nó, và một phương thức được thừa kế từ lớp Aa, vậy lớp Bb1 có 2 phương thức. Bạn dễ dàng liệt kê ra danh sách các phương thức của Bb1 như hình minh hoạ ở trên, danh sách đó là một interface. Và chúng ta có thể coi rằng bất kỳ một lớp nào cũng được coi ngầm định là một interface.
interface_ex1.dart - (Part 2 of 3)
// ....
class Cc1 implements Bb1 {
   void silent() {
      print("Nothing");
   }
   void sayHello(String name)  {
      print("Hello $name");
   }
   // Other members ...
}
Lớp Cc1 thi hành (implements) Bb1. Nếu lớp Cc1 không được định nghĩa là trừu tượng (abstract) thì nó cần phải thi hành (implement) tất cả các phương thức của interface Bb1.
Xem code đầy đủ của ví dụ:
interface_ex1.dart
abstract class Aa {
   void silent();  
}

abstract class Bb1 extends Aa {

   void sayHello(String name)  {
      print("From Bb1, hello $name");
   }
}

class Cc1 implements Bb1 {
   void silent() {
      print("Nothing");
   }
   void sayHello(String name)  {
      print("Hello $name");
   }
   // Other members ...
}

void main()  {
  // Create Aa object:
  Aa obj1 = new Cc1();
  obj1.silent();

  // Create Bb1 object:
  Bb1 obj2 = new Cc1();
  obj2.sayHello("Tom");
}
Output:
Nothing
Hello Tom

2. Interface Example 2

Một lớp có thể thi hành (implements) một hoặc nhiều interface. Danh sách các interface ngăn cách nhau bởi dấu phẩy.
Cú pháp:
class MyClass implements MyInterface1, MyInterface2, MyInterface3
Để đơn giản chúng ta sẽ phân tích code dưới đây:
interface_ex2.dart - (Part 1 of 3)
abstract class Aa {
   void silent();  
}

abstract class Bb1 extends Aa {
   void sayHello(String name)  {
      print("From Bb1, hello $name");
   }
}

class Bb2 {
    void sayBye() {
      print("Bye!");
    }
}
Lớp Bb1 có một phương thức của riêng nó và một phương thức được thừa kế từ lớp Aa. Ngầm định, nó được coi là một interface có 2 phương thức.
Tương tự, lớp Bb2 cũng được coi ngầm định là một interface có 1 phương thức.
Lớp Cc2 thi hành (implements) Bb1Bb2. Nó thi hành tất các các phương thức của các interface:
interface_ex2.dart - (Part 2 of 3)
// ....
class Cc2 implements Bb1, Bb2 {
   void silent() {
      print("Nothing");
   }
   void sayHello(String name)  {
      print("Hello $name");
   }
   void sayBye() {
      print("Good Bye!");
   }
   // Other members ...
}
Xem code đầy đủ của ví dụ:
interface_ex2.dart
abstract class Aa {
   void silent();  
}

abstract class Bb1 extends Aa {
   void sayHello(String name)  {
      print("From Bb1, hello $name");
   }
}

class Bb2 {
    void sayBye() {
      print("Bye!");
    }
}

class Cc2 implements Bb1, Bb2 {
   void silent() {
      print("Nothing");
   }
   void sayHello(String name)  {
      print("Hello $name");
   }
   void sayBye() {
      print("Good Bye!");
   }
   // Other members ...
}

void main() {
   Cc2 obj2 = new Cc2();

   obj2.sayHello("Tom");
   obj2.sayBye();
}
Output:
Hello Tom
Good Bye!

3. Interface Example 3

Một lớp thi hành (implements) các interface, nhưng không có tất cả các phương thức được liệt kê trong interface này thì nó phải được định nghĩa với từ khoá abstract (trừu tượng). Các phương thức còn lại sẽ được thi hành tại các lớp con.
interface_ex3.dart
abstract class Aa {
   void silent();  
}

abstract class Bb1 extends Aa {
   void sayHello(String name)  {
      print("From Bb1, hello $name");
   }
}
// Abstract class
abstract class Cc3 implements Bb1 {
   void silent() {
      print("Nothing");
   }  
}

class Dd extends Cc3  {
   void sayHello(String name)  {
      print("Hi $name");
   }
}

void main() {
   Dd obj = new Dd();

   obj.sayHello("Tom");
}
Output:
Hi Tom