ตัวอย่างเช่นลองพิจารณาฉันมีคลาสสำหรับคลาสอื่นเพื่อขยาย:
public class LoginPage {
public String userId;
public String session;
public boolean checkSessionValid() {
}
}
และคลาสย่อยบางส่วน:
public class HomePage extends LoginPage {
}
public class EditInfoPage extends LoginPage {
}
ในความเป็นจริง subclass ไม่มีวิธีการใด ๆ ที่จะแทนที่ฉันจะไม่เข้าถึง HomePage ด้วยวิธีทั่วไปเช่น: ฉันจะไม่ทำสิ่งที่ชอบ:
for (int i = 0; i < loginPages.length; i++) {
loginPages[i].doSomething();
}
ฉันแค่ต้องการใช้หน้าล็อกอินอีกครั้ง แต่ตามhttps://stackoverflow.com/a/53354ฉันควรชอบการแต่งเพลงที่นี่เพราะฉันไม่ต้องการอินเทอร์เฟซ LoginPage ดังนั้นฉันจึงไม่ใช้การสืบทอดที่นี่:
public class HomePage {
public LoginPage loginPage;
}
public class EditInfoPage {
public LoginPage loginPage;
}
แต่ปัญหามาที่นี่ในเวอร์ชั่นใหม่รหัส:
public LoginPage loginPage;
ซ้ำกันเมื่อมีการเพิ่มคลาสใหม่ และหาก LoginPage ต้องการ setter และ getter จะต้องคัดลอกรหัสเพิ่มเติม:
public LoginPage loginPage;
private LoginPage getLoginPage() {
return this.loginPage;
}
private void setLoginPage(LoginPage loginPage) {
this.loginPage = loginPage;
}
ดังนั้นคำถามของฉันคือ "การรวมตัวกับการสืบทอด" ละเมิด "หลักการแบบแห้ง" หรือไม่?
extends LoginPage
ทั่วสถานที่ ตรวจสอบเพื่อน!
LoginPage
เป็นมัณฑนากร ไม่ต้องทำซ้ำอีกต่อไปเพียงแค่เรียบง่ายpage = new LoginPage(new EditInfoPage())
และเสร็จแล้ว หรือคุณใช้หลักการแบบเปิดปิดเพื่อสร้างโมดูลการรับรองความถูกต้องที่สามารถเพิ่มไปยังหน้าใดก็ได้แบบไดนามิก มีหลายวิธีในการจัดการกับการทำสำเนารหัสโดยส่วนใหญ่เกี่ยวข้องกับการค้นหาสิ่งที่เป็นนามธรรมใหม่ LoginPage
น่าจะเป็นชื่อที่ไม่ถูกต้องสิ่งที่คุณต้องการตรวจสอบให้แน่ใจคือผู้ใช้นั้นได้รับการรับรองความถูกต้องในขณะที่เรียกดูหน้านั้นในขณะที่ถูกเปลี่ยนเส้นทางไปยังLoginPage
หรือแสดงข้อความแสดงข้อผิดพลาดที่เหมาะสมหากเขาไม่ใช่