उदाहरण के लिए, विचार करें कि मेरा विस्तार करने के लिए अन्य वर्गों के लिए एक वर्ग है:
public class LoginPage {
public String userId;
public String session;
public boolean checkSessionValid() {
}
}
और कुछ उपवर्ग:
public class HomePage extends LoginPage {
}
public class EditInfoPage extends LoginPage {
}
वास्तव में, उपवर्ग में ओवरराइड करने के लिए कोई विधि नहीं है, मैं भी होमपेज़ को जेनेरिक तरीके से एक्सेस नहीं करूँगा, अर्थात: मैं ऐसा कुछ नहीं करूँगा:
for (int i = 0; i < loginPages.length; i++) {
loginPages[i].doSomething();
}
मैं सिर्फ लॉगिन पृष्ठ का पुन: उपयोग करना चाहता हूं। लेकिन https://stackoverflow.com/a/53354 के अनुसार , मुझे यहां रचना पसंद करनी चाहिए क्योंकि मुझे इंटरफ़ेस लॉगिन की आवश्यकता नहीं है, इसलिए मैं यहाँ विरासत का उपयोग नहीं करता हूं:
public class HomePage {
public LoginPage loginPage;
}
public class EditInfoPage {
public LoginPage loginPage;
}
लेकिन समस्या यहाँ आती है, नए संस्करण में, कोड:
public LoginPage loginPage;
जब एक नया वर्ग जोड़ा जाता है तो डुप्लिकेट करता है। और अगर LoginPage को सेटर और गेट्टर की जरूरत है, तो अधिक कोड कॉपी करने की आवश्यकता है:
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वह नहीं होने पर एक उचित त्रुटि संदेश को रीडायरेक्ट या दिखाया जाता है।