2015-11-17 2 views
6

में सामान्य इंटरफ़ेस विधि कार्यान्वयन मेरे पास 2 कक्षाएं हैं जो एक विशेष इंटरफ़ेस लागू करती हैं। मैं एक विधि को कार्यान्वित करना चाहता हूं जिसे 2 वर्गों द्वारा साझा किया जाएगा। क्या मैं इंटरफ़ेस क्लास में उस विधि कार्यान्वयन को जोड़ सकता हूं और फिर उस विधि को 2 कक्षाओं से कॉल कर सकता हूं।जावा

उदाहरण के लिए:

public interface DM 
{ 
    public static void doSomething() { 
     System.out.println("Hello World");} 
    } 

    public class A implements DM 
    { 
     doSomething(); 
    } 

    public class B implements DM 
    { 
     doSomething(); 
    } 
} 

यह संभव है? इस

धन्यवाद

उत्तर

4

हाँ, यदि आप जावा 8 का उपयोग कर रहे हैं, आप एक default कार्यान्वयन, इस तरह बना सकते हैं:

public interface DM 
{ 
    default void doSomething() { System.out.println("Hello World");} 
} 

या , अगर यह स्थिर होना चाहिए:

public interface DM 
{ 
    static void doSomething() { System.out.println("Hello World");} 
} 

अधिक जानकारी के लिए, Oracle's documentation on the feature

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

public abstract class DM 
{ 
    public void doSomething() { System.out.println("Hello World");} 
    public abstract void doSomethingElse(); 
} 

public class A extends DM 
{ 
    doSomething(); 
} 

आप इंटरफेस उपयोग करना चाहते हैं तुम भी दृष्टिकोण गठबंधन सकता है, लेकिन नहीं/चूक का उपयोग नहीं होगा कर सकते हैं:

public abstract class DMImpl impelements DM 
{ 
    @Override   
    public void doSomething() { System.out.println("Hello World");} 
} 

public class A extends DM 
{ 
    doSomething(); 
} 
+2

एक अधिक गहन पैटर्न कोशिश इंटरफेस के साथ' सार्वजनिक इंटरफ़ेस DM' शुरू कर सकते हैं सार्वजनिक सारणी कक्षा सार BaseDM लागू करता है डीएम 'तब विस्तार करता है कि' पब्लिक क्लास ए एब्स्ट्रक्टबेस डीएम 'बढ़ाता है और' पब्लिक क्लास बी एब्स्ट्रक्टबेस डीएम 'बढ़ाता है (हालांकि जावा 8 के साथ मैं इन मामलों में से कई के लिए _default_ का उपयोग करूँगा) –

+0

@StephenP यह एक अच्छा बिंदु है, मैं एक करूंगा डीडी कि मेरे जवाब के लिए। –

0

सबसे पहले क्या करना उचित तरीका क्या है, interfaceएक वर्ग नहीं है। इसके बाद, हाँ, के साथ जावा 8 के default methods, आप इंटरफेस, करने के लिए विधि परिभाषाओं में जोड़ सकते हैं

3

आप यह कुछ है जावा 8. के ​​साथ एक default विधि बना सकते हैं सीमाएं लेकिन कुछ साझा साझा कार्यक्षमता के लिए अच्छा है। आम/साझा/डिफ़ॉल्ट कार्यान्वयन `के साथ एक सार आधार वर्ग बना सकते हैं -

https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html

interface DM { 

    default public void doSomething() { 
     System.out.println("Hi"); 
    } 

} 
+1

काम करेगा - हालांकि ध्यान दें कि इंटरफेस के लिए डिफ़ॉल्ट विधियां वास्तव में यह सुनिश्चित करने के लिए होती हैं कि इंटरफ़ेस में कोई नई विधि जोड़े जाने पर सभी कार्यान्वयन कक्षाएं तब नहीं टूटती हैं। यदि आपको वास्तव में दो या दो से अधिक कक्षाओं के लिए एक सामान्य विधि की आवश्यकता है - एक सार वर्ग या संरचना पर विचार करें। – TR1

0

आप इस

interface DM 
{ 
    public void doSomething(); 
} 

class A implements DM 
    { 
     public void doSomething() 
     { 
      System.out.println("Hello World"); 
     } 
    } 

class B implements DM 
    { 
     public void doSomething() 
     { 
      System.out.println("Hello World"); 
     } 
    } 
class Test111 
{ 
    public static void main(String args[]) 
    { 
     System.out.println("Hello"); 
    } 
}