Hướng Dẫn Toàn Diện Về Interface Trong Clprolf
Mục Lục
- Nguyên Tắc Chung
- Interface Tương Thích
- Interface Năng Lực
- Interface Phiên Bản
- Generic
compat_interf - Quy Tắc Kế Thừa và
@Forced_int_inh - Tính Năng Kế Thừa cho Interface
- Kết Luận
- Câu Hỏi Thường Gặp
1. Nguyên Tắc Chung
Trong Clprolf, một interface luôn là một hợp đồng. Điều này áp dụng cho cả phiên bản (các triển khai khác nhau của cùng một khái niệm) và năng lực (các khả năng chung giữa các phiên bản).
Từ Khóa Ngôn Ngữ:
compat_interf_versioncompat_interf_capacity
Chú Thích Khung:
@Compat_interf_version@Compat_interf_capacity
2. Interface Tương Thích
Một interface trong Clprolf được gọi là interface tương thích. Mục đích của nó là đảm bảo rằng một đối tượng là tương thích với một hợp đồng nhất định.
Khi chúng ta khai báo một biến của loại interface, chúng ta không ràng buộc nó với một lớp cụ thể — chỉ với sự tương thích được xác định bởi interface đó.
Sử Dụng with_compat
Bất cứ khi nào một biến, tham số hoặc trường sử dụng loại interface, nó phải được tiền tố bằng with_compat (hoặc @With_compat trong khung). Điều này đánh dấu điểm của liên kết lỏng lẻo.
Ngoại lệ: kiểu trả về của phương thức không yêu cầu with_compat.
java
@With_compat UserDAO dao;
Khái Niệm contracts
Từ khóa Java implements được thay thế bằng contracts. Một lớp liệt kê tất cả các hợp đồng (interfaces) mà nó thực hiện. Trong khung, sử dụng @Contracts.
java
public class UserDAOImpl implements @Contracts UserDAO {
public User getUser(int id) { /* … */ }
}
3. Interface Năng Lực
Một interface năng lực mô tả một khả năng (thuộc tính “-able”), chẳng hạn như Comparable. Nó mở rộng các interface khác nhưng không thể được thực hiện trực tiếp bởi một lớp. Điều này ngăn chặn sự nhầm lẫn giữa các phiên bản và năng lực.
- Mỗi năng lực phải khai báo một lời khuyên:
- Giống như Agent (mặc định)
- Giống như Worker
Trong khung:
java
@Compat_interf_capacity(Advice.FOR_AGENT_LIKE)
public interface ClpComparable<T> {
int compareTo(T other);
}
Trong ngôn ngữ:
@Agent_like_advice hoặc @Worker_like_advice
Một interface phiên bản mở rộng một năng lực cũng phải khai báo một vai trò lớp nhất quán với lời khuyên.
Ví dụ: một interface Car mở rộng ClpComparable<Car> và một CarClass thực hiện nó.
4. Interface Phiên Bản
Một interface phiên bản định nghĩa sự trừu tượng cho nhiều triển khai cụ thể. Nó tương ứng với trường hợp thông thường của liên kết lỏng trong Java.
- Được khai báo bằng
compat_interf_version(hoặc@Compat_interf_version). - Các lớp thực hiện nó cung cấp các phiên bản khác nhau của cùng một khái niệm.
- Ví dụ: nhiều triển khai khác nhau của kết nối cơ sở dữ liệu.
java
@Compat_interf_version
public interface ClpConnection extends Connection {
void close() throws SQLException;
}
@Abstraction
public class MyAwesomeDatabaseConnection implements @Contracts ClpConnection {
public void close() throws SQLException { /* … */ }
}
5. Generic compat_interf
Từ khóa compat_interf là một fallback tổng quát. Nó định nghĩa một interface mà không có vai trò được khai báo. Không được khuyến nghị, nhưng đôi khi hữu ích.
java
public compat_interf MyMysteriousInterface {
void myStrangeJob(String param);
}
6. Quy Tắc Kế Thừa và @Forced_int_inh
Clprolf áp dụng các quy tắc đơn giản và trực quan:
- Một interface phiên bản không thể mở rộng một interface phiên bản khác.
- Bất kỳ interface nào cũng có thể mở rộng một hoặc nhiều interface năng lực.
- Một lớp chỉ có thể thực hiện một interface phiên bản tại một thời điểm.
- Một lớp không thể thực hiện một interface năng lực trực tiếp.
Các vi phạm có thể được bỏ qua rõ ràng bằng @Forced_int_inh, điều này buộc kế thừa interface (trên một lớp, một interface, hoặc một loại hợp đồng cụ thể).
7. Tính Năng Kế Thừa cho Interface
Clprolf cũng cung cấp các tính năng tùy chọn để xử lý các interface như thể chúng là các lớp trừu tượng:
- Sử dụng
naturethay vìextends. - Khai báo vai trò lớp trên interface (ví dụ:
agent). - Các lớp thực hiện phải sử dụng chính xác vai trò đó, không chỉ là một từ đồng nghĩa.
Từ Khóa Đặc Biệt:
version_inhcapacity_inh
Điều này làm cho các interface cư xử như các hệ thống phân cấp đầy đủ trừu tượng, cho phép liên kết lỏng mạnh mẽ trong các dự án hợp tác.
Ví dụ (ngôn ngữ)
java
public version_inh agent Animal {
void eat(String foodName);
}
public version_inh agent Dog nature Animal {
void bark(int duration);
}
public agent AnimalImpl contracts Animal { … }
public agent DogImpl nature AnimalImpl contracts Dog { … }
Ví dụ (khung)
java
@Agent
@Version_inh
public interface Animal {
void eat(String foodName);
}
@Agent
@Version_inh
public interface Dog extends @Nature Animal {
void bark(int duration);
}
8. Kết Luận
Interfaces trong Clprolf luôn liên quan đến tính tương thích:
- Interface phiên bản thống nhất nhiều triển khai của cùng một sự trừu tượng.
- Interface năng lực cung cấp các khả năng cắt ngang, với lời khuyên rõ ràng.
- Tính năng kế thừa cho phép các interface mô phỏng các hệ thống phân cấp lớp, nhưng chỉ khi cần thiết.
Cách tiếp cận này giữ cho thiết kế rõ ràng, nhất quán và hướng đến vai trò, đồng thời bảo tồn sự liên kết lỏng lẻo.
9. Câu Hỏi Thường Gặp
9.1. Interface có thể được sử dụng trong trường hợp nào?
Interfaces được sử dụng khi bạn muốn định nghĩa một hợp đồng mà các lớp khác sẽ thực hiện, giúp tăng tính linh hoạt và khả năng mở rộng của mã.
9.2. Tại sao lại có khái niệm năng lực trong Clprolf?
Khái niệm năng lực giúp phân loại các khả năng chung mà không phải ràng buộc trực tiếp với các lớp cụ thể, từ đó giảm thiểu sự nhầm lẫn trong việc sử dụng.
9.3. Làm thế nào để xử lý các vi phạm quy tắc kế thừa?
Sử dụng @Forced_int_inh để bỏ qua các quy tắc kế thừa khi cần thiết, nhưng nên sử dụng một cách thận trọng để tránh làm rối mã nguồn.