"Xin chào, Amigo! Hôm nay tôi muốn cho bạn biết lý do tại sao giao diện tồn tại. Bạn thường nghe nói rằng một lớp, đối tượng hoặc thực thể nhất định hỗ trợ một giao diện cụ thể. Hỗ trợ một giao diện có nghĩa là gì? "

Các giao diện tồn tại để hỗ trợ hành vi cụ thể - 1

Theo nghĩa rộng hơn, bất kỳ giao diện nào cũng là một cơ chế để thứ gì đó tương tác với thứ khác. Ví dụ: điều khiển TV là một giao diện điều khiển từ xa. Một con chó hiểu và thực hiện các mệnh lệnh, điều đó có nghĩa là con chó đó hỗ trợ giao diện (điều khiển) bằng giọng nói. Tóm lại, chúng ta có thể nói rằng giao diện là một cách được tiêu chuẩn hóa để hai thứ tương tác với nhau, trong đó cả hai bên đều biết tiêu chuẩn đó. Khi một người bảo một con chó "ngồi", mệnh lệnh của người đó là một phần của «giao diện điều khiển bằng giọng nói của chó» và nếu con chó tuân theo mệnh lệnh, thì chúng tôi nói rằng con chó đó hỗ trợ giao diện.

Vì vậy, nó là trong lập trình. Phương thức là các hành động được thực hiện trên một đối tượng, trên dữ liệu của nó. Và nếu một lớp thực hiện một số phương thức nhất định, thì nó «hỗ trợ thực thi» một số lệnh nhất định. Chúng ta đạt được gì khi kết hợp các phương thức vào một giao diện?

1) Mỗi ​​giao diện , giống như một lớp , có một tên duy nhất. Cả hai bên có thể chắc chắn 100% rằng bên kia hỗ trợ giao diện chính xác mà họ biết chứ không phải một số giao diện tương tự.

2) Mỗi ​​giao diện áp đặt một số hạn chế nhất định đối với một lớp sẽ hỗ trợ nó. Lớp (nhà phát triển của nó) quyết định những gì nó sẽ làm khi các phương thức kế thừa từ một giao diện được gọi, nhưng kết quả phải nằm trong giới hạn của những kỳ vọng hợp lý. Nếu chúng ta ra lệnh cho một con chó "ngồi" và sau đó nó lăn tại chỗ trong 5 phút rồi ngồi, thì nó hỗ trợ giao diện. Nhưng nếu thay vào đó, nó nắm lấy chân bạn, thì chúng ta khó có thể nói rằng nó hỗ trợ giao diện. Việc thực thi lệnh không tạo ra kết quả như mong đợi.

Giả sử bạn và bạn bè của bạn đang viết một trò chơi trên máy tính. Và bạn được chỉ định lập trình hành vi của một nhân vật. Một trong những đồng nghiệp của bạn đã viết mã để hiển thị tất cả các ký tự trên màn hình. Một đồng nghiệp thứ hai, người chịu trách nhiệm lưu trò chơi vào đĩa, đã viết mã để lưu tất cả các đối tượng trò chơi vào một tệp. Mỗi người trong số họ đã viết rất nhiều mã và tạo giao diện để tương tác với mã đó. Ví dụ, nó có thể trông như thế này:

mã Java Sự miêu tả
interface Saveable
{
 void saveToMap(Map<String, Object> map);
 void loadFromMap(Map<String, Object> map);
}
— Giao diện lưu trữ/tải đối tượng từ bản đồ.
interface Drawable
{
 void draw(Screen screen);
}
— Giao diện để vẽ một đối tượng bên trong đối tượng Màn hình đã truyền.
class PacMan implements Saveable, Drawable
{
…
}
— Lớp của bạn, hỗ trợ hai giao diện.

Nói cách khác, để hỗ trợ bất kỳ giao diện nào (nhóm giao diện), lớp của bạn phải:

1) Kế thừa chúng

2) Thực hiện các phương thức được khai báo trong đó

3) Các phương thức phải làm những gì chúng dự định làm.

Sau đó, phần còn lại của mã chương trình, không biết gì về lớp của bạn và các đối tượng của nó, có thể hoạt động với lớp của bạn.

"Tại sao mã không thể biết bất cứ điều gì về lớp học của tôi?"

"Giả sử bạn lấy mã từ một chương trình do ai đó viết cách đây một năm. Hoặc giả sử bạn bè của bạn đã mua/cấp phép công cụ trò chơi từ người khác. Bạn có mã hoạt động cho trò chơi. Hàng nghìn đối tượng tương tác với nhau. Và họ có thể dễ dàng tương tác chính xác với các đối tượng của bạn nếu bạn thực hiện tương tác đó thông qua các giao diện mà các lớp của bạn đã triển khai chính xác."

"Xa! Tôi không biết điều đó là có thể."

"Tất cả các dự án lớn đều hoạt động như thế này. Mọi người đã ngừng viết từ đầu từ lâu rồi."

Mọi người cũng không phát minh lại toán học và bảng chữ cái mọi lúc. Thay vào đó, họ nghiên cứu mọi thứ đã được phát minh ra trước họ.