2012-10-19 16 views
5

द्वारा नेस्टेड क्लास के तत्कालता को रोकने की अनुमति दें, लेकिन मैं कंटेनर क्लास और बाहरी कक्षाओं के लिए सुलभ एक नेस्टेड क्लास को परिभाषित करना चाहता हूं, लेकिन मैं नेस्टेड क्लास के तत्काल नियंत्रण को नियंत्रित करना चाहता हूं, जैसे कि केवल कंटेनर वर्ग के उदाहरण नेस्टेड कक्षा के नए उदाहरण बना सकते हैं।बाहरी कक्षाओं

कार्यवाही कोड उम्मीद है कि इस का प्रदर्शन करना चाहिए:

public class Container 
{ 
    public class Nested 
    { 
     public Nested() { } 
    } 

    public Nested CreateNested() 
    { 
     return new Nested(); // Allow 
    } 
} 

class External 
{ 
    static void Main(string[] args) 
    { 
     Container containerObj = new Container(); 
     Container.Nested nestedObj; 

     nestedObj = new Container.Nested();  // Prevent 
     nestedObj = containerObj.CreateNested(); // Allow 

    } 
} 

Nested क्रम में सार्वजनिक किया जाना चाहिए यह External द्वारा सुलभ होने के लिए। मैंने Nested संरक्षित के लिए कन्स्ट्रक्टर बनाने की कोशिश की, हालांकि Container उदाहरण बनाने से ContainerNested का आधार वर्ग नहीं है। मैं Nested से internal के लिए कन्स्ट्रक्टर सेट कर सकता हूं, लेकिन मैं उसी बाहरी असेंबली समेत सभी बाहरी वर्गों द्वारा कन्स्ट्रक्टर तक पहुंच को रोकने के लिए देख रहा हूं। क्या इसे करने का कोई तरीका है?

यदि यह एक्सेस संशोधक के माध्यम से हासिल नहीं किया जा सकता है, तो मुझे आश्चर्य है कि क्या मैं Nested() के भीतर अपवाद फेंक सकता हूं। हालांकि, मुझे नहीं पता कि संदर्भ के लिए परीक्षण कैसे करें जिसमें new Nested() कहा जाता है।

उत्तर

6

इंटरफ़ेस के माध्यम से अमूर्तता के बारे में कैसे?

public class Container 
{ 
    public interface INested 
    { 
     /* members here */ 
    } 
    private class Nested : INested 
    { 
     public Nested() { } 
    } 

    public INested CreateNested() 
    { 
     return new Nested(); // Allow 
    } 
} 

class External 
{ 
    static void Main(string[] args) 
    { 
     Container containerObj = new Container(); 
     Container.INested nestedObj; 

     nestedObj = new Container.Nested();  // Prevent 
     nestedObj = containerObj.CreateNested(); // Allow 

    } 
} 

तुम भी एक सार आधार वर्ग के साथ एक ही बात कर सकते हैं:

public class Container 
{ 
    public abstract class Nested { } 
    private class NestedImpl : Nested { } 
    public Nested CreateNested() 
    { 
     return new NestedImpl(); // Allow 
    } 
} 

class External 
{ 
    static void Main(string[] args) 
    { 
     Container containerObj = new Container(); 
     Container.Nested nestedObj; 

     nestedObj = new Container.Nested();  // Prevent 
     nestedObj = containerObj.CreateNested(); // Allow 

    } 
} 
+0

काम करने लगता है! धन्यवाद! –

1

यह इस तरह से वर्ग घोषित करने के लिए असंभव है। मुझे लगता है कि आपके लिए सबसे अच्छा तरीका क्लास को निजी रूप से घोषित करना होगा और सार्वजनिक इंटरफ़ेस के माध्यम से इसका खुलासा करना होगा:

class Program 
{ 
    static void Main(string[] args) 
    { 
     // new S.N(); does not work 
     var n = new S().Create(); 
    } 
} 

class S 
{ 
    public interface IN 
    { 
     int MyProperty { get; set; } 
    } 
    class N : IN 
    { 
     public int MyProperty { get; set; } 
     public N() 
     { 

     } 
    } 

    public IN Create() 
    { 
     return new N(); 
    } 
} 
संबंधित मुद्दे