2010-04-25 9 views
10

मैं कोड लिख रहा हूं जो Margin, Padding और BorderThicknessSystem.Windows.Documents नामस्थान में कक्षाओं के गुणों को पॉप्युलेट करेगा। इनमें से प्रत्येक गुण System.Windows.Thickness के रूप में एक मान स्वीकार करता है, जो एक संरचना है।संरचना विरासत के लिए एक व्यावहारिक विकल्प है? (सी #)

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

क्या यह हासिल करने के लिए कोई व्यावहारिक तरीका है, जबकि संपत्तियों के साथ प्रकार-संगतता बनाए रखने के दौरान मैं पॉपुलटिंग कर रहा हूं?

अपने विचारों के लिए धन्यवाद,

टिम

उत्तर

9

कोई अच्छा विकल्प हैं।

आप जो करने की कोशिश कर रहे हैं उसके आधार पर, आप शायद अपनी खुद की कक्षा को अपनी आवश्यक संपत्तियों के साथ परिभाषित कर सकते हैं, और अंतर्निहित रूपांतरण ऑपरेटर को सही संरचना प्रकार के लिए एक पूर्ण रूपांतरण करने के लिए परिभाषित कर सकते हैं। फिर आप मोटाई पैरामीटर की अपेक्षा करने वाले सभी तरीकों से अपनी कक्षा में प्रवेश करने में सक्षम होंगे।

यह अंतर्निहित रूपांतरण ऑपरेटर का उपयोग करने की सिफारिश के खिलाफ होगा, हालांकि, यह कहता है कि अंतर्निहित रूपांतरण किसी भी जानकारी को खोना नहीं चाहिए। आप जिस संपत्ति को पढ़ रहे हैं उससे मोटाई वापस नहीं मिल पाएंगे, और आपके द्वारा जुड़ी अतिरिक्त जानकारी देखेंगे।

इस तरह आप इसे लागू कर सकता है:

public class ThicknessEx 
{ 
    public string ExtraData { get; set; } 
    public Thickness Thickness { get; set; } 

    public static implicit operator Thickness(ThicknessEx rhs) 
    { 
     return rhs.Thickness; 
    } 
} 

हालांकि, आप शायद अतिरिक्त डेटा को कहीं और भंडारण के द्वारा बेहतर कर रहे हैं। यह कैसे करें आपकी आवश्यकताओं और आवेदन पर निर्भर करेगा।

+0

एक बहुत ही अभिनव समाधान के लिए धन्यवाद। जैसा कि आप कहते हैं, यह लगभग काम करता है, लेकिन चूंकि अतिरिक्त डेटा उन गुणों से पुनर्प्राप्त नहीं किया जा सकता है, जिन्हें इसे असाइन किया गया था, इसका मतलब है कि इसे कहीं और डुप्लिकेट किया जाना चाहिए, जो कुछ हद तक आत्म-पराजित है। मैंने SetValue() विधि के माध्यम से अंतर्निहित निर्भरता गुणों के साथ काम करने के लिए अपने विचार को अपनाने का प्रयास किया, लेकिन SetValue() टाइपिंग जांच करता है जो अपेक्षित प्रकार को छोड़कर कुछ भी गुजरने में बाधा प्रतीत होता है। –

0

क्या आप एक शब्दकोश नहीं स्टोर कर सकते हैं जहां कुंजी संरचना का हैश कोड है?

+2

यह इस बात पर निर्भर करेगा कि अतिरिक्त डेटा में समान मूल्य रखने के लिए दो समान मोटाई उदाहरणों की आवश्यकता है या नहीं। – driis

+0

हम्म, अच्छा बिंदु। – AndrewVos

1

आप Attached Dependency Properties का उपयोग AugmentedTickness के प्रकार का उपयोग करने में सक्षम हो सकते हैं और फिर, जब वे बदलते हैं, तो उन अंतर्निहित गुणों को अपडेट करें जिन्हें वे अपडेट करना चाहते हैं। इसके लिए आपके संलग्न गुणों का उपयोग करके सभी एक्सेसों की आवश्यकता होती है, क्योंकि बस मोटाई संपत्ति सेट करने से आपकी AugmentedTickness का उपयोग नहीं होगा। यदि आवश्यक हो, तो आप भी (हालांकि यह थोड़ा बुरा हो सकता है) मोटाई गुणों में स्पष्ट परिवर्तनों के लिए सुनो (जिसे आपने शुरू नहीं किया था) और इसे अपने AugmentedTickness द्वारा निर्दिष्ट मान पर वापस मजबूर करें।

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