Ví dụ, hãy xem xét tôi có một lớp để các lớp khác mở rộng:
public class LoginPage {
public String userId;
public String session;
public boolean checkSessionValid() {
}
}
và một số lớp con:
public class HomePage extends LoginPage {
}
public class EditInfoPage extends LoginPage {
}
Trên thực tế, lớp con không có bất kỳ phương thức nào để ghi đè, tôi cũng sẽ không truy cập HomePage theo cách chung, tức là: Tôi sẽ không làm điều gì đó như:
for (int i = 0; i < loginPages.length; i++) {
loginPages[i].doSomething();
}
Tôi chỉ muốn sử dụng lại trang đăng nhập. Nhưng theo https://stackoverflow.com/a/53354 , tôi nên thích sáng tác ở đây vì tôi không cần giao diện LoginPage, vì vậy tôi không sử dụng tính kế thừa ở đây:
public class HomePage {
public LoginPage loginPage;
}
public class EditInfoPage {
public LoginPage loginPage;
}
nhưng vấn đề ở đây, ở phiên bản mới, mã:
public LoginPage loginPage;
trùng lặp khi một lớp mới được thêm vào. Và nếu LoginPage cần setter và getter, nhiều mã cần được sao chép:
public LoginPage loginPage;
private LoginPage getLoginPage() {
return this.loginPage;
}
private void setLoginPage(LoginPage loginPage) {
this.loginPage = loginPage;
}
Vì vậy, câu hỏi của tôi là, "thành phần trên thừa kế" vi phạm "nguyên tắc khô"?
extends LoginPage
khắp nơi. KIỂM TRA MATE!
LoginPage
một trang trí của bạn . Không còn trùng lặp, chỉ đơn giản page = new LoginPage(new EditInfoPage())
và bạn đã hoàn thành. Hoặc bạn sử dụng nguyên tắc đóng mở để tạo mô-đun xác thực có thể được thêm vào bất kỳ trang nào một cách linh hoạt. Có rất nhiều cách để đối phó với sao chép mã, chủ yếu liên quan đến việc tìm kiếm một sự trừu tượng mới. LoginPage
có thể là một tên xấu, điều bạn muốn chắc chắn là người dùng được xác thực trong khi duyệt trang đó, trong khi được chuyển hướng đến LoginPage
hoặc hiển thị một thông báo lỗi thích hợp nếu anh ta không.