2009-08-27 15 views
25

सी # में आप प्रतिनिधियों को गुमनाम रूप से परिभाषित कर सकते हैं (भले ही वे वाक्य रचनात्मक चीनी से अधिक कुछ नहीं हैं)। उदाहरण के लिए, मैं यह कर सकता हूं:जावा में सी # अज्ञात तरीकों के बराबर?

public string DoSomething(Func<string, string> someDelegate) 
{ 
    // Do something involving someDelegate(string s) 
} 

DoSomething(delegate(string s){ return s += "asd"; }); 
DoSomething(delegate(string s){ return s.Reverse(); }); 

क्या जावा में इस तरह के कोड को पास करना संभव है? मैं प्रसंस्करण ढांचे का उपयोग कर रहा हूं, जिसमें जावा का पुराना संस्करण है (इसमें जेनेरिक नहीं है)।

+0

[जावा में सामान्य रूप में प्रतिनिधियों पर एक क्यू] (http://stackoverflow.com/questions/44912/java-delegates) – nawfal

उत्तर

50

पूर्व जावा 8 है कि अन्य की तुलना में:

निकटतम जावा को प्रतिनिधियों को एकल विधि इंटरफेस हैं। आप एक अज्ञात भीतरी कक्षा का उपयोग कर सकते हैं।

interface StringFunc { 
    String func(String s); 
} 

void doSomething(StringFunc funk) { 
    System.out.println(funk.func("whatever")); 
} 

doSomething(new StringFunc() { 
     public String func(String s) { 
      return s + "asd"; 
     } 
    }); 


doSomething(new StringFunc() { 
     public String func(String s) { 
      return new StringBuffer(s).reverse().toString(); 
     } 
    }); 

जावा 8 और इसके बाद के संस्करण:

Java 8 भाषा को लैम्ब्डा भाव कहते हैं।

doSomething((t) -> t + "asd"); 
    doSomething((t) -> new StringBuilder(t).reverse().toString()); 
+2

[गूगल संग्रह] [1] और ग्रोवी [2] आपके लिए ब्याज की हो सकती है। [1] http://code.google.com/p/google-collections/ [2] http://groovy.codehaus.org/ –

11

बिल्कुल इस तरह नहीं है लेकिन जावा के समान कुछ है।

इसे अनाम आंतरिक कक्षा कहा जाता है।

मैं आपको एक उदाहरण देता हूँ:

DoSomething(new Runnable() { 
    public void run() { 
     // "delegate" body 
    } 
}); 

यह एक छोटे से अधिक वर्बोज़ है और लागू करने के लिए, एक इंटरफेस की आवश्यकता है, लेकिन यह काफी एक ही बात

2

यह जावा में इस की तरह कोड पारित करने के लिए संभव है? मैं प्रसंस्करण फ्रेमवर्क का उपयोग कर रहा हूं, जिसमें जावा का काफी पुराना संस्करण है (इसमें जेनेरिक नहीं हैं)।

चूंकि प्रोसेसिंग-विशिष्ट उत्तर के बारे में पूछे जाने वाले प्रश्न के बाद, कोई प्रत्यक्ष समकक्ष नहीं है। लेकिन प्रसंस्करण जावा 1.4 भाषा स्तर का उपयोग करता है, और जावा 1.1 अज्ञात आंतरिक कक्षाएं पेश करता है, जो एक अनुमानित अनुमान हैं।

3

आपका उदाहरण जावा में इस प्रकार दिखाई देगा, anomymous भीतरी वर्गों का उपयोग करना:

interface Func { 
    String execute(String s); 
} 

public String doSomething(Func someDelegate) { 
    // Do something involving someDelegate.execute(String s) 
} 

doSomething(new Func() { public String execute(String s) { return s + "asd"; } }); 
doSomething(new Func() { public String execute(String s) { return new StringBuilder(s).reverse().toString(); } } }); 
2

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

public class Delegate 
{ 
    interface Func 
    { 
     void execute(String s); 
    } 

    public static void doSomething(Func someDelegate) { 
     someDelegate.execute("123"); 
    } 

    public static void main(String [] args) 
    { 

     Func someFuncImplementation = new Func() 
     { 
      @Override 
      public void execute(String s) { 
       System.out.println("Bla Bla :" + s); 
      } 
     }; 

     Func someOtherFuncImplementation = new Func() 
     { 
      @Override 
      public void execute(String s) { 
       System.out.println("Foo Bar:" + s); 
      } 
     }; 


     doSomething(someFuncImplementation); 
     doSomething(someOtherFuncImplementation); 
    } 
} 

आउटपुट:

Bla Bla: 123

फू बार: 123

0

आप सभी यहां भूल गए हैं कि एक सी # प्रतिनिधि सबसे पहले - थ्रेड सुरक्षित है। ये उदाहरण सिर्फ एक थ्रेड ऐप के लिए हैं ..

अधिकांश समकालीन ऐप्स बहुप्रचारित अवधारणा पर लिखे गए हैं .. तो कोई भी जवाब उत्तर नहीं है।

वहाँ जावा में एक समान नहीं है

+0

ऐसा नहीं है कि आप जो कह रहे हैं वह गलत है। यह सही है। समस्या यह है कि यह वास्तव में पूछे जाने वाले प्रश्न का उत्तर नहीं देता --- यह सिर्फ कहता है कि अन्य सभी उत्तरों गलत हैं। क्या आप कह रहे हैं कि जावा में बराबर नहीं है? –

+0

हाँ, मैं कह रहा हूं कि मैं क्या कह रहा हूं .. –

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