2010-05-27 15 views
18

जावा में नाजुक बेस क्लास समस्या क्या है?नाजुक बेस क्लास समस्या क्या है?

+3

आग्रह करता हूं विरोध संदर्भ के लिए एक प्रमुख पुरस्कार! या एक एनआईएन एल्बम ... – scunliffe

+3

इसे आप को तोड़ने के लिए खेद है, @scunliffe, लेकिन आप असफल रहे ;-) –

+0

यदि कोई कहता है कि एफबीसी समस्या में एक अस्पष्ट (या अपूर्ण) निर्दिष्ट अनुबंध के साथ बेस क्लास है तो कक्षा बदलना संभवत: उस पर निर्भर व्युत्पन्न लोगों को तोड़ देगा, क्या वह पर्याप्त होगा? और क्या हम इंटरफेस व्युत्पन्न कर सकते हैं, बीटीडब्ल्यू? – mlvljr

उत्तर

18

एक नाजुक बेस क्लास विरासत के साथ एक आम समस्या है, जो जावा पर लागू होती है और विरासत का समर्थन करने वाली किसी अन्य भाषा पर लागू होती है।

संक्षेप में, बेस क्लास वह वर्ग है जिसे आप विरासत में प्राप्त कर रहे हैं, और इसे अक्सर नाजुक कहा जाता है क्योंकि इस वर्ग में होने वाले परिवर्तनों से प्राप्त होने वाले वर्गों में अप्रत्याशित परिणाम हो सकते हैं।

इसे कम करने के कुछ तरीके हैं; लेकिन विरासत का उपयोग करते हुए पूरी तरह से इसे टालने के लिए कोई सीधा तरीका नहीं है। आप कक्षा में final के रूप में कक्षा घोषणा को लेबल करके कक्षा से विरासत में प्राप्त अन्य वर्गों को रोक सकते हैं।

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

11

एक बेस क्लास को नाजुक कहा जाता है जब इसमें किए गए परिवर्तन व्युत्पन्न वर्ग को तोड़ते हैं।

class Base{ 
    protected int x; 
    protected void m(){ 
     x++; 
    } 

    protected void n(){ 
     x++;  // <- defect 
     m(); 
    } 
} 


class Sub extends Base{ 
     protected void m(){ 
      n(); 
     } 
    } 
+0

यह नाजुक है जब अभिभावक वर्ग में सरल परिवर्तन बच्चे वर्ग को तोड़ते हैं। यदि आप माता-पिता में सब कुछ बदल रहे हैं और इससे बच्चों को तोड़ने का कारण बनता है, तो इसका मतलब यह नहीं है कि माता-पिता नाजुक था; यदि आप कुछ प्रतीत होता है कि बदमाश और चीजें अलग हो जाती हैं, तो यह नाजुक थी। –

+3

लेकिन कौन से परिवर्तन सरल हैं, यानी मानदंड क्या है? – mlvljr

0

सभी क्या "कॉलिन Pickard" ने कहा है कि सच है, और यहाँ मैं सूची सर्वोत्तम प्रथाओं की रक्षा करने के लिए जब आप कोड है कि जावा भाषा में मुद्दों इस तरह का कारण हो सकता है लिख रहे हैं जोड़ना चाहते हैं .. ।

  1. अपने सभी वर्गों के अंतिम बनाओ, क्योंकि उन पर प्राप्त की जा करने के लिए
  2. नहीं करना चाहती आप नहीं कर सकते हैं और आप विरासत (उदाहरण के सार वर्ग) का उपयोग करने के तो अपने सभी कार्यान्वित तरीकों होने के लिए अंतिम बनाने के है, तो इसके उप-वर्गों द्वारा संशोधित नहीं किया गया है (यहां तक ​​कि संरक्षित विधियां आम तौर पर बोलने का एक बुरा विचार है, उप-वर्गों को इतना नहीं पता होना चाहिए इसके उपवर्ग) ... के बारे में
  3. कोशिश एक रिश्ते का उपयोग नहीं करने के बजाय समस्याओं फैली से बचने के लिए अपनी कक्षाओं आरेख उपयोग इंटरफेस के बीच relationsheap [एक का उपयोग करता है] उपयोग करने का प्रयास [एक है] ..
  4. हर फैली हो सकता है औजार द्वारा बदल दिया और आप एक डिफ़ॉल्ट कार्यान्वयन सुनिश्चित करने के लिए है, तो यहाँ एक कोड एक प्रकार का बीज है:

public interface MyBehavior { 
 
    void doAction(); 
 

 
    static class Implementation implements MyBehavior { 
 
     public void doAction() { 
 
      //do some stuff 
 
     } 
 
    } 
 
} 
 

 
// instead of doing extends To a class that have the doAction method 
 
// we will make a [use a] relationShip between the Example class & the Implementation class 
 
public class Example { 
 
    private MyBehavior.Implementation helper = new MyBehavior.Implementation(); 
 

 
    public void doAction() { 
 
     this.helper.doAction(); 
 
    } 
 
}

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