2010-08-09 15 views
9

क्या मैं अमूर्त कक्षा में सी #/नेट में जावा की तरह उदाहरण बना सकता हूं?क्या सी # में अज्ञात सबक्लास बनाने के लिए कोई वाक्यविन्यास है?

अतिरिक्त जानकारी

मुझे लगता है कि हम में से एक बहुत कुछ नहीं समझती कि मैं क्या मतलब है? तो, जावा में मैं सार वर्ग इस तरह बना सकते हैं:

सरल सार वर्ग:

/** 
* @author jitm 
* @version 0.1 
*/ 
public abstract class TestAbstract 
{ 
    public abstract void toDoSmth(); 
} 

कोड जहाँ मैं सार वर्ग के उदाहरण

/** 
* @author jitm 
* @version 0.1 
*/ 
public class Main { 
    public static void main(String[] args) { 
     TestAbstract testAbstract = new TestAbstract() { 
      @Override 
      public void toDoSmth() { 
       System.out.println("Call method toDoSmth"); 
      } 
     }; 
    } 
} 

बनाई गई रिपोर्ट्स मैं करने के लिए कर सकते हैं सी # में ऐसा कुछ करें?

+6

वर्तमान में आपका प्रश्न * दूर * बहुत अस्पष्ट है। विशेष रूप से, आपने शीर्षक में और टैग में अमूर्त कक्षाओं का उल्लेख किया है, लेकिन पाठ के शरीर में नहीं। यदि आपके पास जावा कोड का एक विशेष टुकड़ा दिमाग में है, तो कृपया इसे पोस्ट करें। –

+1

उन्होंने "Abstact" नाम की एक कक्षा का उल्लेख किया। प्रासंगिक हो सकता है। –

+0

नहीं, कक्षा सार सार के बराबर है :) – jitm

उत्तर

8

न तो जावा में और न ही सी # में आप एक अमूर्त वर्ग का उदाहरण बना सकते हैं। आपको हमेशा एक ठोस वर्ग बनाने की आवश्यकता होगी जो अमूर्त वर्ग से प्राप्त हो। जावा अज्ञात वर्गों का उपयोग करके कक्षा को नाम दिए बिना ऐसा करने देता है। सी # आपको वह विकल्प नहीं देता है।

जब आप के साथ एक अमूर्त वर्ग का उपयोग

जावा में आम तौर पर

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

Comparator<Object> comparator = new Comparator<Object>{ 
     @Override 
     public int compare(Object o1, Objecto2) { 
      return o1.getClass().getSimpleName().compareTo(o2.getClass().getSimpleName())); 
     }//I'm not checking for null for simplicity 
    } 
    Collections.sort(list, comparator) 

कुछ सी # 2.0 में और आप से परे लिख सकते हैं Comparison<T> प्रतिनिधि का उपयोग कर बहुत कुछ कर सकते हैं। एक प्रतिनिधि को फ़ंक्शन ऑब्जेक्ट के रूप में या जावा शब्दों में, एक विधि के साथ एक वर्ग के रूप में सोचा जा सकता है। आपको कक्षा बनाने की भी आवश्यकता नहीं है, बल्कि कीवर्ड प्रतिनिधि का उपयोग करके केवल एक विधि है।

Comparison<Object> comparison = delegate(Object o1, Object o2) 
{ 
    return o1.class.Name.CompareTo(o2.class.Name);   
}; 

list.sort(comparison); 

सी # 3.0 में और तुम भी कम कोड lambdas और प्रकार निष्कर्ष का उपयोग कर लिख सकते हैं परे:

list.sort((o1, o2) => o1.class.Name.CompareTo(o2.class.Name)) 

वैसे भी, अगर तुम ग # करने के लिए कोड के रूप जावा माइग्रेट कर रहे हैं आप के प्रतिनिधियों के बारे में पढ़ा जाना चाहिए था ... कई मामलों में आप अज्ञात कक्षाओं के बजाय प्रतिनिधियों का उपयोग करेंगे। आपके मामले में, आप DoSmth() के लिए एक विधि शून्य का उपयोग कर रहे हैं। एक्शन नामक एक प्रतिनिधि है जो काफी समान बात है, कोई पैरामीटर नहीं है और कोई वापसी नहीं है।

+0

हां, मेरा सवाल यह था कि मैं जावा (अज्ञात का उपयोग करके) जैसे उदाहरण बना सकता हूं, वर्तमान में मुझे समझ में आया कि मैं नहीं कर सकता। धन्यवाद। – jitm

+2

कुछ (अधिकांश?) मामलों में, आपको अज्ञात वर्गों को प्रतिनिधियों के साथ प्रतिस्थापित करना चाहिए और आप एक कम कोड भी लिखेंगे ... विशेष रूप से एक विधि वर्ग के साथ। –

+0

2 पाब्लो: क्या आप उदाहरण पोस्ट कर सकते हैं कि इसे कैसे करें, क्योंकि वर्तमान में मैंने सार से सरल वर्ग बनाया है और इसका उपयोग किया है। – jitm

8

नहीं। सीधे नहीं। निकटतम आप (यह मानते हुए आप निम्नलिखित वर्ग संरचना है) आ सकते हैं:

public abstract class AbstractClass 
{ 
} 

public class ChildClass : AbstractClass 
{ 
} 

है:

AbstractClass instance = new ChildClass(); 
0

आप एक अमूर्त वर्ग के बारे में बात कर रहे हैं, जवाब नहीं है। वे लगभग इंटरफेस की तरह हैं, लेकिन कार्यान्वयन जो बाद में एक ठोस वस्तु के द्वारा इस्तेमाल किया जा सकता .. आप एक ठोस वर्ग जो अमूर्त वर्ग

देखें से विरासत बनाना चाहिए अनुमति देते हैं Abstract Classes

+0

कृपया .NET 1.1 लिंक पोस्ट न करें! –

0

पर अधिक नहीं, आप नहीं कर सकते हैं - यही कारण है कि कक्षा को अमूर्त कहा जाता है। आप इससे प्राप्त कर सकते हैं और इस तरह ठोस कार्यान्वित कक्षाएं बना सकते हैं जिन्हें आप तुरंत कर सकते हैं।

0

आप जो पूछ रहे हैं वह थोड़ा उलझन में है। यदि आप पूछ रहे हैं कि क्या आप कक्षा का उदाहरण बना सकते हैं, तो निश्चित रूप से आप कर सकते हैं। सी # या किसी भी भाषा को आप कक्षा को परिभाषित करने में सक्षम क्यों होंगे, लेकिन इसे तुरंत चालू नहीं करेंगे?

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

-1

सी # इस मामले में जावा के समान है, तो आप एक अमूर्त वर्ग को तुरंत चालू नहीं कर सकते हैं।

+0

जावा में मैं कर सकता हूं, केवल मुझे इसकी आवश्यकता है कि यह अमूर्त तरीकों को लागू करे, लेकिन, मैं इसे अनाम कार्यान्वयन की तरह कर सकता हूं। – jitm

+0

उस स्थिति में, फिर नहीं - सी # (जहां तक ​​मुझे पता है कि आपको एक अमूर्त वर्ग का अनाम कार्यान्वयन करने की अनुमति नहीं है)। – RQDQ

+0

आप अभी भी अमूर्त वर्ग को तत्काल नहीं कर रहे हैं, आप एक अज्ञात सबक्लास को तत्काल कर रहे हैं। – Struan