क्या प्रति-फ़ाइल/प्रोजेक्ट-आइटम आधार पर एक कंपाइलर निरंतर परिभाषित करना संभव है?सी # कंपाइलर निरंतर एक PER-FILE आधार पर?
पृष्ठभूमि: मैं एक डाटाबेस एब्स्ट्रक्शन लेयर (डीएएल) प्राप्त करना चाहता हूं, जो सभी को पढ़ता है, और कार्यों को लिखता है, लेकिन एक डीएएल बनाए रखता है जो दोनों कर सकता है, लेकिन एक ही तरीके को कई बार लागू किए बिना (अमूर्त वर्ग का अर्थ है प्रत्येक समर्थित डेटाबेस प्रकार के लिए 1 इंस्टेंस क्लास होगा)। दुर्भाग्य से
abstract class ReadDAL
abstract class WriteDAL
abstract class ReadWriteDAL (multiple-inheritance from Read&Write-DAL).
, कि, काम नहीं करता है, क्योंकि सी # बहु उत्तराधिकार का समर्थन नहीं करता:
तो मैं इस तरह मेरी दाल को अलग करना चाहते।
तो इस समस्या को हल एक ही रास्ता को परिभाषित इंटरफेस द्वारा होगा:
abstract class ReadDAL : IReadDAL
abstract class WriteDAL : IWriteDAL
abstract class ReadWriteDAL : IReadDAL, IWriteDAL
हालांकि, अगर मैं यह कर, मैं इंटरफ़ेस परिभाषा हर बार जब मैं दाल से एक में एक पद्धति को बदलने बदलना होगा , और ReadWriteDAL में परिभाषित विधियों को बदलें, और मुझे कहीं भी विधि कार्यान्वयन की प्रतिलिपि बनाना है, जिसका अर्थ है कि एक DRY-noncompliance गड़बड़ होगी।
मैं सोचा मैं एक ही फाइल कड़ी के रूप में दूसरी बार जोड़ने गया था, और एक एक प्रति परियोजना मद आधार पर परिभाषित होने क्या कर सकता है:
#if SOMECONSTANT // true if file is PartialReadDAL.cs
public partial abstract class ReadDAL
#else // false if "file" is link called "PartialReadWriteDAL.cs" symlinking to PartialReadDAL.cs
public partial abstract class ReadWriteDAL
#endif
and here some implementation.
लेकिन मैं किसी भी तरह एक संकलक निरंतर प्रति परिभाषित कर सकते हैं फाइल?
या किसी भी तरह का एक समान प्रभाव प्राप्त करते हैं?
क्या आप इंटरफेस पर विस्तार विधियों के रूप में अपने तरीकों को कार्यान्वित कर सकते हैं? –
@ लुकास Trzesniewski: सबसे पहले, मैं विस्तार विधियों नहीं चाहता। दूसरा शायद नहीं, भले ही मैं चाहता था। –
आइडिया: एक टी 4 टेम्पलेट से 'ReadWriteDAL' उत्पन्न करें जो' रीडडाल 'और' WriteDAL' को अग्रेषण विधियों को उत्पन्न करता है (जिनके उदाहरण कन्स्ट्रक्टर को पास किया जा सकता है, या उपयुक्त डिफ़ॉल्ट मानते हैं)। संक्षेप में, 'ReadWriteDAL' में कोई रोचक कोड नहीं है, इसलिए यह संभवतः कंप्यूटर द्वारा लिखा जा सकता है। एक और विचार जिसमें कोड जनरेशन शामिल नहीं है: 'ReadWriteDAL' अंतर्निहित रूपांतरण ऑपरेटर को '(i) ReadDAL' और' (I) WriteDAL' दें जो केवल उचित उदाहरण लौटाते हैं। यह वास्तविक चीज़ के रूप में काफी अच्छी तरह से प्रतिस्थापित नहीं करता है, लेकिन यह करीब है। दोनों विचार रचना पर भरोसा करते हैं। –