2009-02-15 12 views
6

मेरे पास कक्षा Server है जो आईआरसी के लिए सर्वर कनेक्शन से बात करती है। इसमें ज्ञात User एस की एक सूची है, और उन्हें आवश्यकतानुसार बनाता है।अन्य वर्गों के लिए छिपी हुई विधियों/गुणों को बनाएं

  1. कोई भी एक User का एक उदाहरण बना सकते हैं:

    मैं User वर्ग से जुड़े दो समस्याएं हैं। मैं केवल Server कक्षा को ऐसा करने में सक्षम होना चाहता हूं।

  2. यदि कोई उपयोगकर्ता (User वर्णन करता है) उसका नाम बदलता है (या अन्य जानकारी, जैसे जुड़े चैनल), Server कक्षा इसे स्वयं बदल सकती है। हालांकि, अन्य वर्ग भी कर सकते हैं! मैं इस वर्ग को छूने से अन्य वर्गों को अस्वीकार करना चाहता हूं (इसे केवल पढ़ने के लिए)।

मैं इन दो समस्याओं को कैसे हल कर सकता हूं? सी ++ में, इसे friend कीवर्ड का उपयोग करके और ctor और setName (और ऐसे) निजी का उपयोग करके हल किया जा सकता है।

क्या कोई सी # कीवर्ड है जो किसी निश्चित विधि द्वारा किसी निश्चित विधि तक पहुंच योग्य हो सकता है? यह मेरी समस्या का समाधान करेगा।

उत्तर

8

ईमानदारी से मुझे friend पहुंच मिलती है जो सी ++ से उत्पन्न होती है जो खराब डिजाइन के लक्षण के रूप में होती है। आप अपने डिजाइन को ठीक करने से बेहतर हैं।

शुरुआत के लिए, अगर कोई उपयोगकर्ता बनाता है तो वास्तव में कौन परवाह करता है? क्या यह वास्तव में मायने रखता है? मैं यह पूछता हूं क्योंकि ऐसा लगता है कि कभी-कभी हम प्रोग्रामर ऐसी चीजों के बारे में चिंतित हो जाते हैं जो बस नहीं होंगे या यदि वे ऐसा करते हैं, तो इससे कोई फर्क नहीं पड़ता।

यदि आप वास्तव में परवाह है फिर निम्न में से एक कार्य करें:

  • मेक उपयोगकर्ता एक इंटरफेस। सर्वर एक निजी वर्ग को तुरंत चालू कर सकता है जो इसे लागू करता है; या
  • उपयोगकर्ता को सार्वजनिक कंस्ट्रक्टर के साथ सर्वर का एक आंतरिक वर्ग बनाएं ताकि सर्वर इसे तुरंत चालू कर सके।

दृश्यता हैक्स (सी ++ में कौन से मित्र हैं और जावा में पैकेज एक्सेस दोनों अच्छे उदाहरण हैं) बस परेशानी के लिए पूछ रहे हैं और एक अच्छा विचार नहीं है।

+0

मैं आपके द्वारा सुझाए गए दोनों तरीकों से चला गया। मैंने एक इंटरफ़ेस IUser और एक सर्वर यूज़र आंतरिक कक्षा बनाई है। (मैं सर्वर को दो वर्गों में भी विभाजित करता हूं ताकि अन्य अपने कस्टम आईआरसी क्लाइंट लिख सकें।) आपके उत्तर के लिए धन्यवाद! – strager

5

.NET दुनिया में निकटतम friendinternal दृश्यता है।

ध्यान दें कि यदि आपके दो वर्ग अलग-अलग असेंबली में हैं, तो आप InternalsVisibleTo विशेषता का उपयोग दूसरे के आंतरिक की एक असेंबली दृश्यता की अनुमति के लिए कर सकते हैं।

1

आपकी कक्षा पदानुक्रम को फिर से डिजाइन करना शायद इस समस्या का एक उचित समाधान है। क्योंकि यह मुझे लगता है कि आपको वास्तव में जो चाहिए वह केवल पढ़ने के लिए उपयोगकर्ता वर्ग है जब यह सर्वर वर्ग के बाहर मौजूद है।

// An abstract base class. This is what I'd use outside the 
// Server class. It's abstract, so it can't be instantiated 
// on its own, and it only has getters for the properties. 
public abstract class User 
{ 
    protected User() 
    { 
    } 

    public string Name { get;} 
    // Other get-only properties 
} 

public class ServerUser : User 
{ 
    public ServerUser() 
    { 
    } 

    public string Name { get; set;} 
    // Other properties. 
} 

फिर सर्वर श्रेणी का निर्माण ServerUser श्रेणियां होती हैं, उपयोगकर्ता के लिए (उपयोगकर्ता नाम बदलने की तरह) ServerUser वर्गों पर गुणों को बदलने के लेकिन केवल बेनकाब उपयोगकर्ता कक्षाएं सर्वर वर्ग:

मैं शायद कुछ इस तरह करना होगा बाहरी दुनिया।

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