2008-09-30 18 views
15

इससे पहले कि आप मुझ पर फायरिंग शुरू करें, मैं ऐसा नहीं कर रहा हूं, लेकिन another post में कोई व्यक्ति ने कहा कि यह संभव था। यह कैसे संभव है? मैंने प्रतिबिंब का उपयोग करके कुछ भी प्राप्त करने के बारे में कभी नहीं सुना है। लेकिन मैं कुछ अजीब बातें देखा है ...नेट में प्रतिबिंब का उपयोग करके आप एक सीलबंद कक्षा से कैसे उत्तराधिकारी हो सकते हैं?

+1

mmhh उपयोग कर सकते हैं मैं यहाँ लगता है कि जब प्रतिष्ठा उपयोगी आता है। जिसने उस प्रश्न का उत्तर दिया वह 1 9 प्रतिनिधि है (सीपी 30 के रूप में) संभावना है कि वह नहीं जानता कि वह किस बारे में बात कर रहा है।दूसरी ओर हम आप कहते हैं, यह संभव नहीं है। इसलिए, आपको इस मामले में अपने आप पर भरोसा करना चाहिए। – OscarRyz

+0

:) Kilhoffer (2,459) बनाम dalle.myopenid.com (1 9) – OscarRyz

+0

लॉल, हास्यास्पद, ऑस्कर! – user18931

उत्तर

13

वर्चुअल फ़ंक्शंस को ओवरराइड करने के बिना, एक सीलबंद वर्ग को उपclassing में बहुत अधिक बिंदु नहीं है।

आप, आप निम्न संकलक त्रुटि मिलती है उस में एक आभासी समारोह के साथ एक सील बंद वर्ग लिखने का प्रयास करें:

// error CS0549: 'Seal.GetName()' is a new virtual member in sealed class 'Seal' 

हालांकि, अगर आप उन्हें एक आधार वर्ग में घोषणा करके सील वर्गों में आभासी कार्यों प्राप्त कर सकते हैं (इस तरह),

public abstract class Animal 
{ 
    private readonly string m_name; 

    public virtual string GetName() { return m_name; } 

    public Animal(string name) 
    { m_name = name; } 
} 

public sealed class Seal : Animal 
{ 
    public Seal(string name) : base(name) {} 
} 

समस्या अभी भी बनी हुई है, हालांकि, मैं कैसे तुम संकलक पिछले चुपके सकता है आप एक उपवर्ग घोषित जाने के लिए नहीं देख सकता। मैंने IronRuby का उपयोग करने की कोशिश की (रूबी सभी हैकी भाषाओं में सबसे हैकस्टी है) लेकिन यहां तक ​​कि यह मुझे नहीं जाने देगी।

'सीलबंद' हिस्सा एमएसआईएल में एम्बेडेड है, इसलिए मुझे लगता है कि सीएलआर स्वयं वास्तव में इसे लागू करता है। आपको कोड लोड करना होगा, इसे अलग करना होगा, 'सीलबंद' बिट को हटा देना होगा, फिर इसे फिर से इकट्ठा करना होगा, और नया संस्करण लोड करना होगा।

+1

मैंने एक उदाहरण देखा है जहां किसी ने स्वयं को क्लियर किया है। डेनिस क्रूज़ और ओडब्ल्यूएएसपी पर एक खोज करें और आपको इसे – alexmac

+1

क्रिक ढूंढना चाहिए। यह कट्टर –

+8

सुरक्षा त्रुटियों जहां हमलावर सुरक्षा प्रणाली से अधिक मजबूत है त्रुटियां नहीं हैं। "मैंने अपने सेल फोन से ब्लूटूथ कमांड का जवाब देने के अलावा सभी ताले को समान रूप से बदलकर अपनी इमारत में तोड़ दिया।" ब्लूटूथ हमले आपके ताले को हटाने के बजाय अप्रासंगिक है! –

1

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

नहीं कि मैं पता हूं कैसे ... यह वही था जो उन्होंने सोचा था।

+0

यही एकमात्र तरीका है जो इसे समझ में आता है। काम शामिल करने के लिए, कैसे कोई इसे औचित्य साबित कर सकता है ?? यह सिर्फ पागल है। – Kilhoffer

+1

आप इसे वैध रूप से उचित नहीं ठहरा सकते हैं। – MagicKat

+1

यदि आपने ऐसा किया है, तो आप वास्तव में एक मुहरबंद वर्ग से नहीं निकल रहे होंगे ... आप सीलिंग को हटाने के लिए कक्षा के साथ खराब हो जाएंगे, फिर सामान्य व्युत्पन्न करेंगे। यह आपकी समस्या का एक वैध समाधान हो सकता है, लेकिन मैं बस इतना कह रहा हूं, यह अब एक सीलबंद वर्ग से नहीं निकल रहा है :-) –

1

अन्य पोस्टर प्रतिबिंब की रेखाओं के साथ और अधिक सोच रहा होगा। अधिक सामान्य पढ़ने-योग्य प्रतिबिंब API के बजाय स्वीकार करें।

हालांकि, अभी भी संभव नहीं है (कम से कम this article के अनुसार)। लेकिन निश्चित रूप से प्रतिबिंब के साथ कुछ पेंच करना संभव है। स्वीकार करें कि जब तक आप वास्तव में उत्सर्जित कोड निष्पादित करने का प्रयास नहीं करते हैं तब तक फंस नहीं जाते हैं।

8

मुझे अन्य धागे में गलत धारणा पोस्ट करने के लिए खेद है, मैं सही ढंग से याद करने में विफल रहा। निम्नलिखित उदाहरण का उपयोग करके, Reflection.Emit का उपयोग करके, दिखाता है कि किसी अन्य वर्ग से कैसे प्राप्त किया जाए, लेकिन यह TypeLoadException को फेंकने पर रनटाइम पर विफल रहता है।

sealed class Sealed 
{ 
    public int x; 
    public int y; 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     AppDomain ad = Thread.GetDomain(); 
     AssemblyName an = new AssemblyName(); 
     an.Name = "MyAssembly"; 
     AssemblyBuilder ab = ad.DefineDynamicAssembly(an, AssemblyBuilderAccess.Run); 
     ModuleBuilder mb = ab.DefineDynamicModule("MyModule"); 
     TypeBuilder tb = mb.DefineType("MyType", TypeAttributes.Class, typeof(Sealed)); 

     // Following throws TypeLoadException: Could not load type 'MyType' from 
     // assembly 'MyAssembly' because the parent type is sealed. 
     Type t = tb.CreateType(); 
    } 
} 
+2

यदि आप जो चीज उत्पन्न कर चुके हैं उसे लोड नहीं कर सकते हैं, तो मुझे नहीं लगता कि व्युत्पन्न वर्ग बनाने के रूप में गणना की जाती है ... आखिरकार, आप 'प्रतिबिंब। प्रवेश' का उपयोग करके सभी प्रकार की गड़बड़ कर सकते हैं, लेकिन वह ऐसा नहीं करता है कि वे चीजें किसी भी तरह वैध हैं। –

+4

@ ओरियनएडवर्ड्स: यही वह है जो मैंने इस जवाब में लिखा था। यह काम नहीं करेगा, और मैं अपनी पिछली धारणाओं में गलत था। – dalle

-2

यह

public class GenericKeyValueBase<TKey,TValue> 
    { 
     public TKey Key; 
     public TValue Value; 

     public GenericKeyValueBase(TKey ItemKey, TValue ItemValue) 
     { 
      Key = ItemKey; 
      Value = ItemValue; 
     } 
    } 

में GenericKeyValueBase बुलाया

पुट इस एक नया वर्ग बनाएं और उस से विरासत के साथ साथ आप के लिए जोड़ें अतिरिक्त विस्तार विधियां जोड़ सकते हैं/निकालें (Addat और RemoveAt) करने के लिए अपने यदि आप वास्तव में अच्छा महसूस कर रहे हैं तो नई व्युत्पन्न कक्षा (और इसे एक संग्रह/शब्दकोश बनाएं)।

एक साधारण implentation उदाहरण है जहाँ आप एक आधार के लिए एक सामान्य System.Collections.Generic.KeyValuePair का प्रयोग करेंगे, लेकिन इसके बजाय ऊपर कोड

class GenericCookieItem<TCookieKey, TCookieValue> : GenericKeyValueBase<TCookieKey,TCookieValue> 
    { 
     public GenericCookieItem(TCookieKey KeyValue, TCookieValue ItemValue) : base(KeyValue, ItemValue) 
     { 
     } 
    } 
+0

मैं यह देखने में असफल रहा कि यह कैसे सीलबंद कक्षाओं से विरासत से संबंधित है। – Abel

+0

उपरोक्त को लागू करने वाली मुहरबंद कक्षाएं अब छद्म विस्तारशीलता के लिए टीसीकीकी/वैल्यू ऑब्जेक्ट्स के साथ बढ़ने की क्षमता होगी। विधि भी कक्षा वर्ग में छुपाया जा सकता है ... – Jay

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

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