2011-10-26 11 views
6

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

program consapp; 

{$APPTYPE CONSOLE} 

uses 
    ExceptionLog, 
    SysUtils; 

type 
    a = record 
    b : integer; 
    case isEnabled : boolean of 
    true : (c:Integer); 
    false : (d:String[50]); 
    end; 


var test:a; 

begin 
test.b:=1; 
test.isEnabled := False; 
test.c := 3; //because isenabled is false, I want that the c element to be unavailable to the coder, and to access only the d element. 
Writeln(test.c); 
readln; 
end. 

क्या यह संभव है?

उत्तर

7

टैग के मूल्य के बावजूद, एक संस्करण रिकॉर्ड में सभी प्रकार के फ़ील्ड हर समय उपलब्ध हैं।

अभिगम्यता नियंत्रण प्राप्त करने के लिए आप देख रहे हैं कि आपको गुणों का उपयोग करने और पहुंच-योग्यता को नियंत्रित करने के लिए रनटाइम चेक की आवश्यकता होगी।

type 
    TMyRecord = record 
    strict private 
    FIsEnabled: Boolean; 
    FInt: Integer; 
    FStr: string; 
    // ... declare the property getters and settings here 
    public 
    property IsEnabled: Boolean read FIsEnabled write FIsEnabled; 
    property Int: Integer read GetInt write SetInt; 
    property Str: string read GetString write SetString; 
    end; 
... 
function TMyRecord.GetInt: Integer; 
begin 
    if IsEnabled then 
    Result := FInt 
    else 
    raise EValueNotAvailable.Create('blah blah'); 
end; 
+2

+1। मैं 80% था यकीन है कि यह जवाब है ... – RBA

+2

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

-3

दिया गया उदाहरण एक संस्करण रिकॉर्ड नहीं है, इसमें हर समय सभी फ़ील्ड शामिल हैं।

एक वास्तविक संस्करण रिकॉर्ड में समान स्मृति साझा करने वाले वेरिएंट हैं। आप बस "केस भेदभावकर्ता: डिस्कटाइप ....." वाक्यविन्यास का उपयोग करते हैं, एक अलग फ़ील्ड की आवश्यकता नहीं है जो आपको बताती है कि कौन सा संस्करण सक्रिय है।

+0

यह एक संस्करण रिकॉर्ड है। मामला ऐसा करता है। –

+0

आप ** पूर्ण ** चर के बारे में बात कर रहे हैं, जो एक और पूरी तरह से अलग बात है। डेविड सही है, यह एक संस्करण रिकॉर्ड है। –

+0

इसमें सभी फ़ील्ड शामिल नहीं हैं, इसके बजाय यह 'case' _ के बाद सभी भागों तक पहुंच देता है, और वे सभी एक ही स्मृति साझा करते हैं। तो यह ** पूर्ण ** युद्धों के समान है, सिवाय इसके कि: यह अधिक संरचित है; आपके पास टैग वैरिएबल है; और, संभव है, स्मृति संरेखण थोड़ा अलग है –

3

यहां तक ​​कि अगर मैंने सुना है कि मूल निक्लौस विर्थ के पास्कल परिभाषा से सभी काम करना चाहिए के रूप में आप की उम्मीद, मैं डेल्फी में ऐसी कोई व्यवहार देखा था, अपने पूर्वज, Turbo Pascal 2.0 से शुरू। फ्रीपास्कल पर त्वरित रूप से पता चला कि its behaviour वही है। जैसा कि Delphi documentation में कहा गया है:

आप किसी भी समय किसी भी प्रकार के किसी भी क्षेत्र को पढ़ या लिख ​​सकते हैं; लेकिन यदि आप एक संस्करण में किसी फ़ील्ड में लिखते हैं और फिर किसी अन्य संस्करण में किसी फ़ील्ड में लिखते हैं, तो आप अपना डेटा ओवरराइट कर सकते हैं। टैग, अगर वहाँ एक, रिकॉर्ड की गैर संस्करण हिस्सा। "

में (प्रकार ordinalType की) एक अतिरिक्त क्षेत्र के रूप में कार्य अपने इरादे के बारे में, जहाँ तक मैं यह समझ, मैं दो का प्रयोग करेंगे है विभिन्न वर्गों,

a = class 
     b : Integer 
    end; 

    aEnabled = class(a) 
     c: Integer 
    end; 

    aDisabled = class(a) 
     d: String //plus this way you can use long strings 
    end; 

इस तरह की तरह आप भी designtime पर आईडीई के कोड संपादक से कुछ समर्थन मिल सकता है। अधिक उपयोगी है, हालांकि, यह है कि यह हो जाएगा ज्यादा अधिक आसान संशोधित करने और बाद में समर्थन करने के लिए।

है

हालांकि, अगर आपको रिकॉर्ड वीए की त्वरित स्विचिंग की आवश्यकता है रनटाइम पर तर्कसंगत मान, @David Heffernan's variant, गुणों का उपयोग करने और रनटाइम चेक होने के लिए, अधिक उचित है।

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