मुझे किसी तृतीय-पक्ष घटक को ठीक करने की आवश्यकता है।डेल्फी: वंश के वर्ग में निजी पूर्वजों के क्षेत्र को लिखना
TThirdPartyComponentBase = class
private
FSomeVar: Integer;
public
...
end;
TThirdPartyComponent = class (TThirdPartyComponentBase)
protected
procedure Foo; virtual;
end;
procedure TThirdPartyComponent.Foo;
begin
FSomeVar := 1; // ACCESSING PRIVATE FIELD!
end;
यह काम करता है क्योंकि दोनों वर्गों एक ही इकाई में हैं, इसलिए वे इस किस्म की "मित्र" कर रहे हैं: इस घटक की क्लास निजी चर जो सक्रिय रूप से अपने वंश द्वारा प्रयोग किया जाता है।
लेकिन अगर मैं एक नई इकाई
TMyFixedComponent = class (TThirdPartyComponent)
procedure Foo; override;
end;
मैं FSomeVar अब और उपयोग नहीं कर सकते में एक नया वर्ग बनाने की कोशिश करता हूँ, लेकिन मैं अपने को ठीक करने के लिए इसका इस्तेमाल करने की जरूरत है। और मैं वास्तव में बेस क्लास के उस पेड़ के अपने कोड में पुन: पेश नहीं करना चाहता हूं।
क्या आप उस मूल क्षेत्र तक पहुंचने के लिए कुछ त्वरित हैक की सलाह दे सकते हैं, मूल घटक की इकाई को बदले बिना यह संभव है?
@ एंड्रयू: ध्यान दें कि जैसे ही पूर्वजों (तृतीय पक्ष) घटक परिवर्तन के मेमोरी लेआउट के रूप में यह समाधान टूट जाएगा। हो सकता है कि आप इसे ब्रेक न करें, क्योंकि कुछ भी आपको इसके बारे में चेतावनी नहीं देगा। या आप नकली गलत व्यवहार देख सकते हैं (यदि आप भाग्यशाली हैं: अभिगम उल्लंघन) क्योंकि आप उस डेटा को ओवरराइट करना शुरू करते हैं जो आपका नहीं है। –
@ जेरोइन प्लूइमर मैंने एंड्रयू को उस तथ्य के बारे में नोटिस किया है। लेकिन इस मुद्दे के लिए कोई अन्य समाधान नहीं है। – oodesigner
क्लास हेल्पर्स हैकिंग के बिना ऐसा कर सकते हैं, मेरा जवाब देखें :) –