Giao diện hữu ích vì chúng cho phép bạn chuyển đổi các triển khai của một lớp, trong khi vẫn cho phép xác thực rằng loại được truyền theo yêu cầu của giao diện.
Lấy sau (thường được sử dụng) ví dụ:
interface Quackable {
void quack();
}
này quy định các yêu cầu của một lớp sẽ được chuyển đến một phương pháp như:
sayQuack(Quackable quackable) {
quackable.quack();
}
cho phép bạn sử dụng bất kỳ cách triển khai nào của đối tượng có thể đặt được, chẳng hạn như:
class MockDuck implements Quackable {
void quack() => print("quack");
}
class EnterpriseDuck implements Quackable {
void quack() {
// connect to three enterprise "ponds"
// and eat some server bread
// and say "quack" using an messaging system
}
}
Cả hai việc triển khai này sẽ hoạt động với hàm sayQuack(), nhưng một yêu cầu đòi hỏi cơ sở hạ tầng ít hơn đáng kể so với phương thức khác.
sayQuack(new EnterpriseDuck());
sayQuack(new MockDuck());
Tôi sử dụng mẫu này mọi lúc trong thế giới Java khi xây dựng các giải pháp sử dụng một số "doanh nghiệp vịt". Khi phát triển cục bộ, tất cả những gì tôi chỉ cần là có thể gọi hàm sayQuack() và trả về một số dữ liệu giả lập mã hóa cứng.
Duck gõ
Vì Dart là tùy chọn đánh máy, bạn không thực sự cần phải sử dụng giao diện, bạn chỉ cần viết một lớp có chứa các phương pháp chữ ký đúng sẽ làm việc (mặc dù các công cụ sẽ không thể để xác thực nó).
class Person { // note: no implements keyword
void quack() => "I'm not a duck";
}
sayQuack(new Person()); // provides the quack method, so this will still work
Tất cả các lớp là giao diện
Cuối cùng, tất cả các lớp học cũng là giao diện. Điều này có nghĩa rằng mặc dù hệ thống của bên thứ ba có thể đã được viết mà không cần sử dụng giao diện, nhưng bạn vẫn có thể sử dụng một lớp bê tông như thể nó là một giao diện.
Ví dụ, hãy tưởng tượng thư viện doanh nghiệp như sau:
class EnterpriseDuck { // note: no implements keyword
void quack() {
// snip
}
}
sayQuack(EnterpriseDuck duck) { // takes an instance of the EnterpriseDuck class
duck.quack();
}
Và bạn muốn vượt qua một con vịt giả vào phương pháp sayQuack trong một cách mà các kiểm tra loại có thể xác nhận. Bạn có thể tạo mockDuck của bạn để thực hiện các giao diện ngụ ý bởi EnterpriseDuck, chỉ đơn giản bằng cách sử dụng các EnterpriseDuck như một giao diện:
class MockDuck implements EnterpriseDuck {
void quack() => "I'm a mock enterprise duck";
}
Nhiều Inheritance
Xét về đa kế thừa, điều này là không thể trong Dart. Bạn có thể, tuy nhiên, thực hiện nhiều giao diện và cung cấp triển khai của riêng bạn trong những phương pháp cần thiết, ví dụ:
class MultiDuck implements Quackable, EnterpriseDuck, Swimable {
// snip...
}
Giao diện có thể có các lớp học mặc định
Khi bạn sử dụng Dart, bạn sẽ thấy rằng hầu hết các "lớp học "thực sự là giao diện. Danh sách, Chuỗi v.v ... ... là tất cả các giao diện có triển khai mặc định được cung cấp. Khi bạn gọi
List myList = new List();
bạn đang thực sự sử dụng giao diện Danh sách và từ khóa mới chuyển hướng từ giao diện sang triển khai Danh sách mặc định cơ bản.
Liên quan đến phát triển trong một đội
Giao diện này rất hữu ích trong việc phát triển đội ngũ, ngay cả trong thế giới mã nguồn mở. Giao diện xác định các phương thức và thuộc tính mà bạn nên xây dựng để thành phần của bạn hoạt động với thành phần của tôi. Bạn có thể xây dựng triển khai thử nghiệm của riêng mình cho giao diện đó và tôi có thể xây dựng triển khai thực hiện cụ thể của giao diện đó và khi chúng ta hoàn tất, chúng tôi có thể tích hợp. Nếu không có giao diện được chia sẻ, được công bố, tôi sẽ cần phải cung cấp triển khai cụ thể của tôi trước khi bạn thực sự có thể bắt đầu.
Hy vọng điều đó sẽ hữu ích!
Cảm ơn rất nhiều Chris, đó chính xác là những gì tôi cần. Ngoài ra, tên lớp của bạn trong các ví dụ là đáng yêu. – snitko
trong suy nghĩ của bạn, hai ý kiến mã của bạn: '// note: no keyword keyword' thay vì '// note: no implement keyword'. – GameAlchemist
Cân nhắc việc cập nhật điều này hoặc thêm nhận xét vào bài đăng này giải thích rằng từ khóa giao diện không còn được sử dụng trong Dart nữa. –