2010-09-28 22 views
10

क्या 100% अमूर्त वर्ग का उपयोग करने का कोई कारण नहीं है और इंटरफ़ेस नहीं है? क्या आप दोनों का उपयोग करने के लिए मुझे एक अच्छा उदाहरण दे सकते हैं ताकि मैं अवधारणा को थोड़ा समझ सकूं?100% सार वर्ग बनाम इंटरफेस

अद्यतन: 100% सार वर्ग -> अमूर्त वर्ग केवल अमूर्त तरीकों के साथ। यदि मैं इस पहलू के बारे में PHP और जावा के बीच अंतर करता हूं तो मैं curios हूं।

Update2: यहां तक ​​कि अगर मैं कारणों मैं में तकनीकी कारणों से वैचारिक अधिक अधिक इच्छुक हूँ के सबसे को समझते हैं।

+0

'100% अमूर्त वर्ग' को परिभाषित करने के लिए कैसे? –

+0

जावा या PHP? इनमें से कौनसा? – Thilo

+3

मुझे लगता है कि उनका मतलब केवल अमूर्त विधियों के साथ एक अमूर्त वर्ग है, कोई 100% अमूर्त वर्ग में कोई डिफ़ॉल्ट कार्यान्वयन –

उत्तर

18

यदि "100% अमूर्त वर्ग" से आपका मतलब है "अमूर्त वर्ग बिना ठोस तरीके", तो मैं एक कारण के बारे में सोच सकता हूं: दृश्यता।

आप संरक्षित होने के लिए एक सार विधि को परिभाषित कर सकते हैं, और इसलिए कक्षा के सार्वजनिक एपीआई का हिस्सा नहीं है। हालांकि, यह एक अजीब डिजाइन की तरह लगता है।

एक और चीज जो मेरे दिमाग में आई, जब आप बेस क्लास में सामान्य कार्यक्षमता जोड़ने की उम्मीद करते हैं - यानी यदि सभी कार्यान्वयनकर्ताओं द्वारा साझा की जाने वाली कुछ उपयोगिता विधियों की संभावना है, लेकिन इन विधियों को लागू नहीं किया गया है।

एक और बात - उदाहरण चर। आप अमूर्त वर्ग में विरासत उदाहरण चर हो सकते हैं।

+6

नहीं है, आप गैर निरंतर चर परिभाषित भी कर सकते हैं जिन्हें गरम किया जा सकता है। इंटरफेस के साथ यह संभव नहीं है। –

+0

@ बेनोइट कोर्टिन बिल्कुल। जब आप टिप्पणी करते थे तो मैं इसे जोड़ रहा था :) वैसे भी धन्यवाद। – Bozho

+2

एक और चीज रचनाकार है ... यह इंटरफेस –

0

100% सार वर्ग अच्छा विचार नहीं है। बाल वर्गों की सामान्य संरचना के लिए इंटरफेस का उपयोग करता है। इसी तरह के तरीकों के साथ समान कक्षाओं के लिए और समान वर्गों का उपयोग करने के लिए दूसरों को बेहतर नहीं है।

2

दृश्यता के बगल में, एक अन्य कारण एक निश्चित निर्माता को निर्दिष्ट करने में सक्षम होना चाहिए जिसे आप सभी कार्यान्वयन को कार्यान्वित करना चाहते हैं, या किसी निश्चित संपत्ति को परिभाषित करना चाहते हैं। लेकिन आम तौर पर, मैं अलेक्जेंडर से सहमत हूं कि 100% अमूर्त वर्ग एक अच्छा विचार नहीं है। मैं ज्यादातर मामलों में एक इंटरफ़ेस पसंद करूंगा जब तक इंटरफ़ेस का उपयोग न करने का बहुत अच्छा कारण हो।

1

मैं व्यक्तिगत रूप से तकनीकी से अधिक वैचारिक के रूप में अंतर सोचता हूं। उदाहरण के लिए "मानव" नामक एक इंटरफ़ेस रखना और उन्हें नर और मादा पर लागू करना बुरा विचार होगा। मानव को वर्ग के रूप में बनाने के लिए यह और अधिक समझदारी होगी।

आप एक से अधिक इंटरफेस लागू कर सकते हैं और आप के रूप में ऐड-ऑन इंटरफेस देखना चाहिए।

+0

मानव इंटरफ़ेस रखना कितना बुरा विचार है? –

+0

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

+0

यहां तक ​​कि मानव इंटरफेस दिशानिर्देश भी हैं ;-) – Thilo

11

एक मामले में जहां एक "100% अमूर्त वर्ग" एक अंतरफलक से अधिक लाभप्रद हो सकता है स्थानों पर जहां एपीआई स्थिरता एक प्रमुख चिंता का विषय है में है।

आप एक API जहां अन्य लोग आपके इंटरफ़ेस आपको इंटरफ़ेस से चिपक है लागू करने के लिए उम्मीद कर रहे हैं लिखते हैं। आप बाद में इंटरफ़ेस में कोई भी तरीका नहीं जोड़ सकते हैं क्योंकि इससे सभी क्लाइंट टूट जाएंगे (आपको दूसरे इंटरफ़ेस को लागू करके इस पर काम करना होगा और अपने कोड को उदाहरण के साथ जांच को फिर से जांचने दें और फॉलबैक प्रदान करें)।

आप एक वर्ग आप (गैर सार) के तरीकों पर बाद में ग्राहक को तोड़ने के बिना जोड़ सकते हैं के साथ एक ही एहसास है।

+1

+1। यह java.sql.Connection जैसे जेडीके इंटरफेस के साथ एक समस्या है, जहां वे हर समय विधियों को जोड़ते हैं, इसलिए पुराने कार्यान्वयन अब संकलित नहीं होते हैं। – Thilo

+0

यदि संग्रह इंटरफेस "शुद्ध" अमूर्त वर्ग थे, तो हमें डिफेंडर विधियों की आवश्यकता नहीं होगी। –

1

मैं काफी कैसे धारणात्मक अब यह जवाब देने के लिए यकीन नहीं है, लेकिन व्यवहार में मैं निम्नलिखित कारणों के लिए इंटरफेस का उपयोग करें:

  • विभिन्न वर्गों को दर्शाने के लिए एक साझा इंटरफेस है: है कि आप उन्हें हेरफेर कर सकते हैं/उपयोग के तरीके से ही
  • आप एक से अधिक इंटरफेस को लागू कर सकते हैं, लेकिन केवल सार वर्गों का उपयोग करने के लिए एक वर्ग

कारणों का विस्तार:

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

100% अमूर्त वर्ग का आपका उदाहरण मुझे बेवकूफ लगता है। जहां तक ​​मैं देख सकता हूं कि यह केवल एक इंटरफ़ेस बना देगा, अतिरिक्त प्रतिबंध के साथ कि आप केवल एक ही हो सकते हैं।

0

यहां एक साधारण उदाहरण है जिसे केवल इंटरफेस द्वारा हासिल किया जा सकता है।

interface P { 
    void p(); 
} 

interface Q { 
    void q(); 
}  

interface R { 
    void r(); 
} 

class PQR implements P, Q, R { 
    @Override 
    public void p() { 
     System.out.println("P"); 
    } 

    @Override 
    public void q() { 
     System.out.println("Q"); 
    } 

    @Override 
    public void r() { 
     System.out.println("R"); 
    } 
} 

class A { 
    public void a(P pRef) { 
     pRef.p(); 
    } 
} 

class B { 
    public void b(Q qRef) { 
     qRef.q(); 
    } 
} 

class C { 
    public void c(R rRef) { 
     rRef.r(); 
    } 
} 

public class InterfaceDemo { 
    public static void main(String[] args) { 
     P p = new PQR(); 
     A ainvoker = new A(); 
     ainvoker.a(p); 

     Q q = new PQR(); 
     B binvoker = new B(); 
     binvoker.b(q); 

     R r = new PQR(); 
     C cinvoker = new C(); 
     cinvoker.c(r); 
    } 
} 
संबंधित मुद्दे