2011-12-31 20 views
5

यह अनिवार्य रूप से है कि मैं क्या करना चाहते हैं:किसी संपत्ति के लिए वर्चुअल गेटर और सार सेटटर को कैसे परिभाषित किया जाए?

public abstract class Uniform<T> 
{ 
    public readonly int Location; 
    private T _variable; 

    public virtual T Variable 
    { 
     get { return _variable; } 
    } 
} 

public class UniformMatrix4 : Uniform<Matrix4> 
{ 
    public override Matrix4 Variable 
    { 
     set 
     { 
      _variable = value; 
      GL.UniformMatrix4(Location, false, ref _variable); 
     } 
    } 
} 

Variable के लिए गेटर सभी व्युत्पन्न वर्ग में एक ही होगा, लेकिन सेटर अलग होने की जरूरत है।

वास्तव में ... मैं कक्षाओं को व्युत्पन्न नहीं करना चाहता हूं (यह केवल एक फ़ंक्शन कॉल है जो प्रत्येक प्रकार के लिए भिन्न होगा) लेकिन मैं नहीं सोच सकता कि यह और कैसे करें।


संपादित करें: तो यह स्पष्ट नहीं था कि समस्या क्या मैं आ रही है, है मैं एक सिंटैक्स त्रुटि हो रही है:

'UniformMatrix4.Variable.set': cannot override because 'Uniform.Variable' does not have an overridable set accessor

और मुझे यकीन है बनाने का तरीका नहीं कर रहा हूँ एक "अतिरंजित सेट एक्सेसर" ... virtual और abstract सेटटर पर अनुमति नहीं लगती है।

+1

अपने संपादित के बारे में: यही कारण है कि मैं जवाब है कि मैं दे दिया दिया है। मैंने पहले इस समस्या से परेशान किया है। –

उत्तर

8

सी # में ऐसा करना संभव नहीं है, लेकिन एक कामकाज के रूप में आप यह कर सकते हैं। इसमें एक अमूर्त सेटर फ़ंक्शन को कॉल करना शामिल होगा जिसे मानक प्राप्त करने के दौरान व्युत्पन्न कक्षाओं द्वारा ओवरराइड किया जा सकता है। क्या यह काम करेगा?

public abstract class Uniform<T> 
{ 
    public readonly int Location; 
    protected T _variable; 

    public T Variable 
    { 
     get { return _variable; } 
     set { SetVariable(value); } 
    } 

    protected abstract void SetVariable(T value); 
} 

public class UniformMatrix4 : Uniform<Matrix4> 
{ 
    public override void SetVariable(Matrix4x4 value) 
    { 
     _variable = value; 
     GL.UniformMatrix4(Location, false, ref _variable); 
    } 
} 
+0

हां, यह काम करेगा। अतिरिक्त वर्चुअल फ़ंक्शन कॉल की कीमत पर। –

+0

दिलचस्प समाधान! और वह व्युत्पन्न कक्षाओं को सेटटर को लागू करने के लिए मजबूर करेगा। काफी साफ नहीं है, लेकिन यह सुरक्षित है। मुझें यह पसंद है! – mpen

+0

यदि आप ऐसा कर रहे हैं, तो 'वेरिएबल' को वर्चुअल होने की आवश्यकता नहीं है। – Gabe

2

सी # में ऐसा करना संभव नहीं है। आपको बेस क्लास में एक सेटर जोड़ना होगा, और इसे "अमान्य ऑपरेशन" अपवाद फेंकना होगा।

+0

मुझे लगता है कि 'NotImplementedException' अधिक समझ में आता है, लेकिन ऐसा लगता है कि अब काम कर रहा है: डी – mpen

+0

दरअसल, आप अपवाद के बारे में सही हो सकते हैं; उदाहरण के लिए, यदि आप इसे संशोधित करने का प्रयास करते हैं तो ReadOnlyCollection वर्ग फेंकता है। –

6

ऐसा करने के लिए की आवश्यकता होगी:

public abstract class Uniform<T> 
{ 
    public readonly int Location; 

    public virtual T Variable 
    { 
     get; set; 
    } 
} 

public class UniformMatrix4 : Uniform<Matrix4> 
{ 
    public override Matrix4 Variable 
    { 
     get 
     { 
      return base.Variable; 
     } 
     set 
     { 
      base.Variable = value; 
      GL.UniformMatrix4(Location, false, ref value); 
     } 
    } 
} 

मैं समझता हूँ के रूप में, व्यवहार की उम्मीद होगी।

उम्मीद है कि यह मदद करता है।

+1

'_variable'' value' होना चाहिए क्योंकि आपने मेरे बैकिंग सदस्य को हटा दिया है, लेकिन पर्याप्त बंद करें! ऐसा नहीं लगता था कि मैं इसे बिना किसी के कर सकता हूं। – mpen

+0

मैंने इसे ठीक किया। धन्यवाद! – ivowiblo

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

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