2013-02-21 17 views
10

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

abstract public class Thing 
{ 
    public enum Status { Accepted, Denied, Pending }; 
    abstract public Status status { get; private set; } 
    etc... 
} 

मैं तो फैसला किया कि यह एक बेहतर डिजाइन हो सकता है अगर बात एक अंतरफलक था: कक्षा एक नेस्टेड enum इस तरह एक सा है, यह अंदर परिभाषित है। लेकिन मैं यह नहीं कर सकता:

public interface Thing 
{ 
    enum Status { Accepted, Denied, Pending }; 
    Status status { get; } 
    etc... 
} 

यह त्रुटि संदेश उत्पन्न करता है "इंटरफेस प्रकार घोषित नहीं कर सकता।" हालांकि, अगर मैं इंटरफ़ेस के बाहर enum की परिभाषा को स्थानांतरित करता हूं, तो सबसे पहले मैं encapsulation तोड़ना होगा (स्थिति प्रकार वास्तव में चीज से संबंधित है और अपने आप पर अर्थहीन है) और सबसे महत्वपूर्ण बात यह है कि मुझे कोड जाना और संशोधित करना होगा इसका उपयोग करने वाली कई अन्य असेंबली। क्या आप किसी भी समाधान के बारे में सोच सकते हैं?

+0

आप के बारे में * तोड़ने * कैप्सूलीकरण (आप द्वारा defintion इंटरफेस में डेटा सदस्यों कैप्सूलीकरण नहीं कर सकता) चिंतित है, तो आप एक वर्ग के रूप 'Thing' छोड़ देना चाहिए है। आपके सार आधार वर्ग में कुछ भी गलत नहीं है। –

+0

कुछ अन्य स्थानों को मिला जहां यह सवाल पूछा गया था, इस पर इस टिप्पणी के कुछ अच्छे विकल्प हैं। http://social.msdn.microsoft.com/forums/en-US/csharpgeneral/thread/14beb8d1-63d9-42f7-b036-eb9ebb106d08 मूल रूप से, आप या तो कहीं और enum घोषित कर सकते हैं, या इसके बजाय कक्षा का उपयोग कर सकते हैं एक इंटरफ़ेस .... और यह इसके बारे में है। आप जो करने की कोशिश कर रहे हैं, वही करने का कोई तरीका नहीं है, करुणा को दूर करता है। – Nevyn

+4

"encapsulation" तर्क मेरे साथ तर्क नहीं करता है और मैं आपको सलाह देता हूं कि आप सार्वजनिक नेस्टेड प्रकार से छुटकारा पाएं। अगर इसे दुनिया के सामने उजागर किया जा सकता है, तो इसका इलाज करें। –

उत्तर

13

त्रुटि इंगित करता है, तो आप सिर्फ इंटरफेस के बाहर Status की परिभाषा को खींचने के लिए किया है। मैं समझता हूं कि यह encapsulation तोड़ता है, लेकिन इसके आसपास वास्तव में कोई रास्ता नहीं है। मेरा सुझाव है कि आप Status का नाम बदल दें जो Thing - ThingStatus के साथ मजबूत संबंध इंगित करता है, यह चाल चलाना चाहिए।

enum ThingStatus { Accepted, Denied, Pending }; 

public interface Thing 
{ 
    ThingStatus status { get; } 
    etc... 
} 
3

अरे हाँ, समाधान करता है, तो आप इस तरह के कार्यान्वयन की जरूरत है एक अमूर्त वर्ग का प्रयोग है। सार वर्ग खराब डिजाइन नहीं हैं और इस तरह की स्थितियों में निश्चित रूप से उपयोगी हैं।

यदि आप इंटरफेस का उपयोग करने पर जोर देते हैं, तो मुझे डर है कि आपको p.s.w.g से समाधान के साथ जाना होगा और नियम या दो तोड़ना होगा (वे वैसे भी दिशानिर्देश हैं, वास्तव में)।

1

abstract वर्ग और interface अलग बातें हैं। abstarct कक्षा अबास्ट्रक्शन है, जो आपके डोमेन मॉडल से अधिक है और इंटरफ़ेस आपकी डोमेन इकाई का अनुबंध (व्यवहार) है। आप आवश्यकतानुसार अपने समाधान में दोनों का उपयोग कर सकते हैं। कंक्रीट परिदृश्य में status व्यवहार नहीं है यह केवल इकाई की स्थिति है। मुझे लगता है कि अमूर्त वर्ग अधिक विश्वसनीय विकल्प है।

+0

इस दृष्टिकोण के लिए धन्यवाद, यह कुछ सोचने के लिए है। ब्याज के एक बिंदु के रूप में, ध्यान दें कि अमूर्त कक्षाओं का उपयोग उन भाषाओं में इंटरफेस के रूप में किया जाता है, जिनमें उनके वाक्यविन्यास (सी ++ स्पष्ट उदाहरण होने के कारण) इंटरफेस नहीं होते हैं। –

+0

@ KlitosKyriacou अमूर्त वर्ग का उपयोग करके सभी सदस्यों को सार के रूप में घोषित करके इंटरफ़ेस के रूप में हासिल किया जा सकता है। लेकिन यह सी # में बिल्कुल सही नहीं है। –

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