2013-05-20 10 views
11

मेरे पास मेरे कोड का एक अनुभाग है जहां कुछ कक्षाएं इंटरफेस को कार्यान्वित कर रही हैं।सार कक्षा और इंटरफ़ेस एक साथ?

यह सही लगता है, लेकिन वहाँ बच्चे वर्गों के बीच एक छोटे से दोहराव है - अर्थात् 3 तरीकों।

तो यह एक अमूर्त वर्ग का उपयोग करने के लिए चिल्ला रहा है। सार वर्ग

  • बाल कक्षाओं का विस्तार करने के इंटरफेस और बच्चे कक्षाओं को लागू करने के

    1. सार वर्ग:

      मेरा प्रश्न है, वहाँ दोनों सार वर्ग और निम्न परिस्थितियों में इंटरफ़ेस का उपयोग कर किसी भी विपक्ष हो जाएगा सार वर्ग का विस्तार करने और इंटरफ़ेस को लागू करने

    या

    चाहिए सार वर्गों और इंटरफेस इस तरह एक साथ इस्तेमाल नहीं किया जा सकता है?

  • +1

    कोई कारण नहीं है कि उन्हें –

    +2

    नहीं होना चाहिए, बिल्कुल नहीं। कार्य में, मैं जो कुछ करता हूं वह बिल्कुल इस तरह है। –

    उत्तर

    16

    इन दोनों का एक साथ उपयोग करना बिल्कुल सामान्य है। उदाहरण के लिए AbstractList (List लागू करना) और AbstractMap (Map लागू करना) जेडीके में विचार करें।

    मेरे घुटने झटका प्रतिक्रिया सार वर्ग इंटरफ़ेस को लागू और फिर ठोस वर्ग यह से निकाले जाते हैं राशि के लिए हो गया होता:

    abstract class Base implements TheInterface { 
        /* ...shared methods... */ 
    } 
    
    class Concrete1 extends Base { } 
    
    class Concrete1 extends Base { } 
    

    लेकिन आपका प्रश्न अन्य संभावना को ऊपर उठाने के लिए मुझे लगता है कि बनाया है, और मैं इसे उस तरह से कर रही है के खिलाफ एक तर्क के ज्यादा नहीं देख सकते हैं:

    abstract class Base { 
        /* ...shared methods... */ 
    } 
    
    class Concrete1 extends Base implements TheInterface { } 
    
    class Concrete1 extends Base implements TheInterface { } 
    

    इसके अलावा, मैं इसे इस तरह से कर रही है एक तर्क के लिए देख सकते हैं, विशेष रूप से है कि यह सार ग के बीच युग्मन को हटा घास और इंटरफ़ेस। यदि आपके पास एक और कक्षा है जिसे कार्यक्षमता की आवश्यकता है Base प्रदान करता है लेकिन इंटरफ़ेस को लागू करने की आवश्यकता नहीं है, तो आपके पास ऐसा करने में लचीलापन है।

    एक तीसरा विकल्प भी है: संरचना। आप सब पर एक अमूर्त वर्ग के लिए नहीं कर सकता है, बल्कि कई ठोस वर्ग है कि इंटरफ़ेस उपयोग एक आम सहायक वर्ग को लागू उनके कार्यान्वयन में है:

    class Helper { 
        /* ...shared methods... */ 
    } 
    
    class Concrete1 implements TheInterface { 
        /* ...uses instance of Helper */ 
    } 
    
    class Concrete1 implements TheInterface { 
        /* ...uses instance of Helper */ 
    } 
    

    यह है कि एक ही लचीलापन, एक और रूप में।

    1

    मुझे नहीं लगता कि अंगूठे का नियम ऐसा है। डिजाइनिंग करते समय यह पता लगाने के लिए कि आप क्या कर रहे हैं, अच्छा या बुरा है, यह जानने के लिए सोलिड सिद्धांतों का पालन करें। आप इन सिद्धांतों को here से अधिक पा सकते हैं। इस विशेष मामले में, मुझे लगता है कि आपको यह सुनिश्चित करना चाहिए कि आप "ओपन-क्लोज़ सिद्धांत" का पालन कर रहे हैं।

    0

    व्यक्तिगत रूप से मैं यह बयान पसंद करता हूं कि एक सार वर्ग अन्य वर्गों के लिए पृष्ठभूमि है, इसलिए यदि तीन अन्य वर्गों में कुछ आम है, तो उनके सामान्य पूर्वजों, केवल तीन अन्य वर्गों के लिए बनाए गए अमूर्त वर्ग को भी कोड प्रदान करना चाहिए इंटरफेस। इससे अमूर्त वर्ग "पूर्ण" (इसके रास्ते में) इन सभी गुणों और विधियों को प्रदान करेगा जो तीन वर्गों को साझा करते हैं।

    हालांकि, अगर वे सभी एक ही इंटरफ़ेस को लागू करेंगे तो अंत में कोई फर्क नहीं पड़ता है। सारणी वर्ग बनाना जो सामान्य है, मेरी राय में एक और स्पष्ट तरीका है। कक्षाओं की तुलना करना केवल इतना आसान है कि यह अलग-अलग दिखता है।

    संबंधित मुद्दे