मुझे लगता है कि साझा स्थिरांक के लिए एक इंटरफेस का उपयोग कर भ्रमित दो अलग अवधारणाओं का एक उदाहरण है:
- कोड पुन: उपयोग
- Subtyping
मेरे अनुभव में उपवर्गीकरण का उपयोग कर, या इंटरफेस कार्यान्वयन बस कोड के डुप्लिकेशंस को रोकने के लिए समस्याएं होती हैं। आपका कोड अधिक नाजुक हो जाता है। उदाहरण के लिए, कोई व्यक्ति निरंतर फिर से परिभाषित कर सकता है - विशेष रूप से यदि आपकी कक्षा पदानुक्रम कई कक्षाएं गहरी है।
अक्सर आपके कोड को DRY रखने के लिए संरचना का उपयोग करना बेहतर होता है।
इस तरह से विरासत का उपयोग करने में एक और समस्या यह है कि आम तौर पर इस प्रकार की विरासत आपकी कक्षा के एपीआई का हिस्सा बनती है। वर्ग के पदानुक्रम कक्षा के बाहर दिखाई देता है। यह encapsulation तोड़ता है।कक्षा के बाहर स्थिरांक के उपयोग को बेनकाब करने की कोई आवश्यकता नहीं है, वे आपके वर्ग को लागू करने के लिए चुने गए हैं और इसके एपीआई (आपके उदाहरण में) का हिस्सा नहीं हैं।
इससे भयानक पिछड़ा संगतता समस्याएं हो सकती हैं। किसी और के साथ आते हैं और इस तरह कोड लिख सकते हैं:
public interface Constants {
static final int CONST = 2;
}
public class MyClass implements Constants {
int doSomething(int input) {
return CONST * input;
}
}
public class ThirdPartyClass {
int doSomethingElse(int input) {
return MyClass.CONST + input;
}
}
अब, अगर आप आप अब तय MyClass में CONST उपयोग करने के लिए आप अटक कर रहे हैं की जरूरत है। क्योंकि थर्डपार्टी क्लास ने MyClass में उपलब्ध CONST पर निर्भरता बनाई है।
आप इसके साथ समाप्त कर सकते हैं। जहां MyClass इंटरफ़ेस में किसी भी स्थिरांक का उपयोग नहीं कर रहा है, लेकिन अभी भी इसे लागू करना है।
public interface Constants {
static final int CONST = 2;
}
public class MyClass implements Constants {
int doSomething(int input) {
return input;
}
}
public class ThirdPartyClass {
int doSomethingElse(int input) {
return MyClass.CONST + input;
}
}
संक्षेप में; ऐसा कभी मत करो!
(+1), यह पूरी तरह से अनुकरण नहीं कर रहा है, क्योंकि यह विधियों के स्थिर आयात के लिए काम नहीं करता है – Bozho
असल में, इस तर्क में कुछ परिपत्र तर्क भी हैं। हम निरंतर केवल कक्षाओं का वारिस नहीं करते हैं क्योंकि आप स्थिर आयात का उपयोग कर सकते हैं। लेकिन हमें स्थिर आयात का उपयोग क्यों करना चाहिए क्योंकि हम इंटरफ़ेस का उत्तराधिकारी हो सकते हैं ?? यहां तक कि बिना किसी "हैक" को यह कहते हुए भी कहा जाता है कि इसे "हैक" क्यों माना जाता है जैसे "खराब शैली" मंत्र दोहराया जाता है। –
अंतर यह है कि स्थैतिक आयात एक भाषा सुविधा है जो विशेष रूप से इसे अनुमति देने के लिए पेश की जाती है, जबकि इंटरफेस का उद्देश्य काफी अलग है; इस प्रकार, इस तरह एक इंटरफेस का उपयोग एक हैक है; मैंने सोचा कि बिना कहने के चला गया। –