2013-07-12 5 views
9

क्या सी # में केवल कक्षाओं को विस्तारित करना संभव नहीं है बल्कि कार्यों को जोड़कर। पूर्व: मेरे पास एक मानक डीएलएल लाइब्रेरी है जिसका मैं भरोसा कर रहा हूं और विक्रेता इसे संशोधित नहीं करना चाहता है।सी # गुणों को जोड़कर कक्षा बढ़ाएं

पहले से ही कोड में मैंने डेटासेल क्लास का व्यापक रूप से उपयोग किया है और केवल अब एहसास हुआ है कि मुझे इसमें एक अतिरिक्त संपत्ति जोड़ने की आवश्यकता है, क्योंकि इस वर्ग से प्राप्त एक नई एक्सटेंशन क्लास बनाने के लिए ऐसा लगता है कि यह काम करेगा + बहुत सारे पुनर्लेखन।

DataCell [मेटाडाटा]

public class DataCell : Message 
{ 
public int Field1; 
public int Field2; 
public DataCell() 
{ 
.. 
} 
.. 
} 

मूल रूप से मैं एक सार्वजनिक पूर्णांक झंडे जोड़ना चाहते हैं; इस वर्ग के लिए। तो मैं अब कुछ भी लिखने के बिना कर सकता हूं, (नया डेटासेल)। फ्लैग = 0x10;

+1

आपके पास विस्तार गुण नहीं हो सकते हैं लेकिन आप कक्षा का उत्तराधिकारी बना सकते हैं और गुण जोड़ सकते हैं – Sayse

+0

इस मामले में "विस्तार" से आपका क्या मतलब है? क्या आपके पास स्रोत कोड है? या आप एक विस्तार संपत्ति का उपयोग करना चाहते हैं (जो आप नहीं कर सकते)? या डेटासेल से विरासत में है? – Tim

+0

विस्तार से मेरा मतलब है कि इस वर्ग का उपयोग विक्रेताओं में किया जाता है। डीएल lib जो मैं उपयोग कर रहा हूँ। ExtDataCell की तरह बनाना: DataCell एक विकल्प नहीं है क्योंकि मुझे मूल रूप से .dll lib को फिर से लिखना होगा। तो मैं किसी भी तरह से ऐसा करने में सक्षम होना चाहता हूं ताकि विक्रेताओं से डेटासेल। डीएल में संपत्ति हो सकती है, जिनके पास एटीएम नहीं है। (विक्रेता डीएल संशोधित किए बिना) –

उत्तर

6

सबसे पहले, आपको शायद अपने दृष्टिकोण पर पुनर्विचार करना चाहिए। लेकिन बाकी सब विफल रहता है, आपके द्वारा की तरह एक सील बंद वर्ग के लिए एक संपत्ति जोड़ सकते हैं:

using System; 
using System.Runtime.CompilerServices; 

namespace DataCellExtender 
{ 

    #region sample 3rd party class 
    public class DataCell 
    { 
     public int Field1; 
     public int Field2; 
    } 
    #endregion 

    public static class DataCellExtension 
    { 
     //ConditionalWeakTable is available in .NET 4.0+ 
     //if you use an older .NET, you have to create your own CWT implementation (good luck with that!) 
     static readonly ConditionalWeakTable<DataCell, IntObject> Flags = new ConditionalWeakTable<DataCell, IntObject>(); 

     public static int GetFlags(this DataCell dataCell) { return Flags.GetOrCreateValue(dataCell).Value; } 

     public static void SetFlags(this DataCell dataCell, int newFlags) { Flags.GetOrCreateValue(dataCell).Value = newFlags; } 

     class IntObject 
     { 
      public int Value; 
     } 
    } 


    class Program 
    { 
     static void Main(string[] args) 
     { 
      var dc = new DataCell(); 
      dc.SetFlags(42); 
      var flags = dc.GetFlags(); 
      Console.WriteLine(flags); 
     } 
    } 
} 

कृपया जब तक आप वास्तव में होना चाहिए ऐसा नहीं करते हैं। इस कोड के भविष्य के रखरखावकर्ताओं के पास आपके लिए कुछ मजबूत शब्द हो सकते हैं यदि एक क्लीनर समाधान है जिसे आपने इस छोटे से हैकी दृष्टिकोण के पक्ष में छोड़ दिया है।

+1

यह निश्चित रूप से एक दिलचस्प कामकाज है। मैं पहले क्लीनर विकल्पों का पता लगाऊंगा, लेकिन कम से कम विचार करने लायक है। –

+0

@ जोन्स स्केट आह हाँ, मैं स्पष्ट रूप से उल्लेख करना भूल गया कि यह कितना भयानक है और यह नहीं किया जाना चाहिए। मैं इसे संपादित करूंगा। – dss539

+0

वाह इस प्रश्न में 10k विचारों को मारा गया। इसे सबसे अच्छे उत्तर के रूप में स्वीकार किया गया क्योंकि ऐसा लगता है कि मुझे तब चाहिए था। प्रदर्शन पर यकीन नहीं है। –

7

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

DataCell cell = new DataCell(); 

तो अपने Field1 और Field2 क्षेत्रों की जरूरत नहीं होगा।

यदि बेस 0 वर्ग के प्रत्येक उदाहरण में वास्तव में इन फ़ील्ड होना चाहिए, तो आप इसे विस्तारित करने के बजाय बेस क्लास को कैसे बदल सकते हैं, इस पर काम करना बेहतर होगा।

यदि आप सोच रहे थे कि क्या आप एक्सटेंशन एक्सटेंशन विधियों जोड़े गए हैं (उदा। public static void Foo(this DataCell cell)) तो नहीं, यह संभव नहीं है।

+0

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

+0

@ वैंस: ठीक है, यह अभी भी अस्पष्ट है कि मूल रूप से बेस क्लास में अतिरिक्त फ़ील्ड होना चाहिए, या बेस क्लास का मालिक कौन है। लेकिन आप केवल उन वर्गों में फ़ील्ड नहीं जोड़ सकते हैं जिनके पास आपके स्वामित्व नहीं हैं। –

+0

@ जोन्स स्केट - क्या आप इस परिदृश्य के मेरे उत्तर की आलोचना करना चाहते हैं? http://stackoverflow.com/a/17617683/55721 – dss539

2

वहाँ एक मौजूदा वर्ग

  1. के गुण जोड़ने के दो तरीके आंशिक वर्ग जोड़े हैं, लेकिन क्योंकि आंशिक वर्गों में एक ही विधानसभा में होना चाहिए तो यह आपके लिए काम नहीं करेगा।

  2. इस कक्षा को एक अलग वर्ग में विरासत में ले जाएं, जहां तक ​​मुझे पता है कि आपके लिए एक बेहतर समाधान होगा।

और कोई भी एक्सटेंशन विधि जैसे एक्सटेंशन प्रॉपर्टी का उपयोग नहीं कर सकता।

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