यहां मेरी कक्षा का सरलीकृत संस्करण है:क्या बेस क्लास निर्धारित कर सकता है कि व्युत्पन्न वर्ग ने वर्चुअल सदस्य को ओवरराइड किया है या नहीं?
public abstract class Task
{
private static object LockObject = new object();
protected virtual void UpdateSharedData() { }
protected virtual void UpdateNonSharedData() { }
public void Method()
{
lock(LockObject)
{
UpdateSharedData();
}
UpdateNonSharedData();
}
}
मैं व्युत्पन्न कक्षाओं से लॉकिंग कोड को छिपाने की कोशिश कर रहा हूं। लेकिन अगर मैं व्युत्पन्न क्लास UpdateSharedData को ओवरराइड करता हूं तो मैं केवल लॉक प्राप्त करना चाहता हूं; यदि ऐसा नहीं होता है, तो मैं नहीं चाहता कि अन्य सभी चल रहे उदाहरणों पर ब्लॉक करने और प्रतीक्षा करने की विधि जो गैर-साझा डेटा अपडेट करने से पहले साझा डेटा अपडेट करें।
तो विधि (ऐसा प्रतीत होता है) विधि के लिए स्पष्ट बात यह जांचना और देखना है कि क्या वर्तमान उदाहरण के अपडेटशेडडेटा के कार्यान्वयन ने बेस क्लास के कार्यान्वयन को ओवरराइड कर दिया है। मुझे यकीन है कि प्रतिबिंब का उपयोग किए बिना यह संभव नहीं है, और शायद ऐसा करने के लिए वांछनीय नहीं है।
मैंने इस पर कुछ कामकाज के बारे में सोचा है, लेकिन वे सभी बहुत अजीब हैं:
- व्युत्पन्न वर्ग के कन्स्ट्रक्टर सेट की एक संरक्षित बूल संपत्ति जोड़ें, और उस संपत्ति को जांचें कि यह देखने के लिए कि क्या लॉक है जरूरत है। यह व्युत्पन्न कक्षाओं से लॉकिंग कोड छिपाने का एक बहुत ही भयानक काम कर रहा है।
- UpdateSharedData विधि को एक प्रतिनिधि संपत्ति बनाएं, किसी व्युत्पन्न क्लास को प्रॉपर्टी को अपने कन्स्ट्रक्टर में एक निजी विधि में सेट करें, और केवल प्रतिनिधि लॉक प्राप्त करें यदि प्रतिनिधि शून्य नहीं है। यह बेहतर है, लेकिन यह अभी भी बेकार है।
मुझे अभी एहसास हुआ कि IHasSharedData LOLCats कोड की तरह दिखता है। :-) ICanHazSharedData? – tvanfosson
यह पहली बात थी जो मैंने देखा था! मेरे लिए ऐसा नाम देने का विरोध करना मेरे लिए बहुत कठिन होगा। यह वही जवाब है जिसे मैं फिर भी ढूंढ रहा था। –