मेरे लिए, यह समझ में आता है क्योंकि यह सामान्य नामांकितता पर भरोसा करने के बजाय कक्षा को एक ठोस नाम देता है। दूसरी ओर, ऐसी कई कक्षाएं हैं जिनमें बस कोई अतिरिक्त गुण नहीं है।
क्या इस दृष्टिकोण में कोई कमी है?
दृष्टिकोण बुरा नहीं है, लेकिन बेहतर समाधान उपलब्ध हैं। संक्षेप में, एक इंटरफ़ेस इसके लिए एक बेहतर समाधान होगा। यहां इंटरफेस और इनहेरिटेंस अलग होने का मुख्य कारण यह है कि आप केवल एक वर्ग से विरासत में मिल सकते हैं, लेकिन आप कई इंटरफेस लागू कर सकते हैं ।
उदाहरण के लिए, विचार करें कि आपने संस्थाओं और नामित संस्थाओं का नाम दिया है। आपके पास कई संस्थाएँ हैं:
One
ऑडिटेड इकाई नहीं है और न ही नाम वाली संस्था है। यह आसान है:
public class One
{ }
Two
एक नामित संस्था है, लेकिन एक ऑडिटेड इकाई नहीं है। अनिवार्य रूप से अब आपके पास क्या है:
public class NamedEntity
{
public int Id { get; set; }
public string Name { get; set; }
}
public class Two : NamedEntity
{ }
Three
एक नामित और अंकेक्षित दोनों प्रविष्टि है। यह वह जगह है जहाँ आप एक समस्या में भागते हैं। आप एक बना सकते हैं AuditedEntity
आधार वर्ग है, लेकिन आप नहीं कर सकते हैं Three
इनहेरिट दोनों AuditedEntity
और NamedEntity
:
public class AuditedEntity
{
public DateTime CreatedOn { get; set; }
public DateTime UpdatedOn { get; set; }
}
public class Three : NamedEntity, AuditedEntity // <-- Compiler error!
{ }
हालाँकि, आप AuditedEntity
इनहेरिट करने से वर्कअराउंड के बारे में सोच सकते हैं NamedEntity
। यह सुनिश्चित करने के लिए एक चतुर हैक है कि हर वर्ग को केवल एक दूसरे वर्ग से विरासत (सीधे) की आवश्यकता है।
public class AuditedEntity : NamedEntity
{
public DateTime CreatedOn { get; set; }
public DateTime UpdatedOn { get; set; }
}
public class Three : AuditedEntity
{ }
यह अभी भी काम करता है। लेकिन आपने जो यहां किया है वह यह बताया गया है कि प्रत्येक ऑडिटेड इकाई स्वाभाविक रूप से एक नामित इकाई भी है । जो मुझे मेरे अंतिम उदाहरण के लिए लाता है। Four
एक ऑडिटेड इकाई है, लेकिन नामित इकाई नहीं है। लेकिन आप Four
से विरासत में मिलने नहीं दे सकते AuditedEntity
क्योंकि तब आप NamedEntity
ऑडिटेडइनिटी and
नामांकितता के बीच विरासत के कारण भी इसे बना रहे होंगे।
वंशानुक्रम का उपयोग करना, दोनों को बनाने Three
और Four
काम करने का कोई तरीका नहीं है जब तक कि आप डुप्लिकेटिंग कक्षाएं शुरू नहीं करते हैं (जो समस्याओं का एक नया सेट खोल देता है)।
इंटरफेस का उपयोग करते हुए, यह आसानी से प्राप्त किया जा सकता है:
public interface INamedEntity
{
int Id { get; set; }
string Name { get; set; }
}
public interface IAuditedEntity
{
DateTime CreatedOn { get; set; }
DateTime UpdatedOn { get; set; }
}
public class One
{ }
public class Two : INamedEntity
{
public int Id { get; set; }
public string Name { get; set; }
}
public class Three : INamedEntity, IAuditedEntity
{
public int Id { get; set; }
public string Name { get; set; }
DateTime CreatedOn { get; set; }
DateTime UpdatedOn { get; set; }
}
public class Four : IAuditedEntity
{
DateTime CreatedOn { get; set; }
DateTime UpdatedOn { get; set; }
}
यहां केवल मामूली खामी यह है कि आपको अभी भी इंटरफ़ेस को लागू करना है। लेकिन आपको एक सामान्य पुन: प्रयोज्य प्रकार होने से सभी लाभ मिलते हैं, बिना किसी कमियों के जो किसी भी इकाई के लिए कई सामान्य प्रकारों पर विविधताओं की आवश्यकता होती है।
लेकिन आपका बहुरूपता बरकरार है:
var one = new One();
var two = new Two();
var three = new Three();
var four = new Four();
public void HandleNamedEntity(INamedEntity namedEntity) {}
public void HandleAuditedEntity(IAuditedEntity auditedEntity) {}
HandleNamedEntity(one); //Error - not a named entity
HandleNamedEntity(two);
HandleNamedEntity(three);
HandleNamedEntity(four); //Error - not a named entity
HandleAuditedEntity(one); //Error - not an audited entity
HandleAuditedEntity(two); //Error - not an audited entity
HandleAuditedEntity(three);
HandleAuditedEntity(four);
दूसरी ओर, ऐसी कई कक्षाएं हैं जिनमें बस कोई अतिरिक्त गुण नहीं है।
यह मार्कर इंटरफ़ेस पैटर्न पर एक भिन्नता है , जहाँ आप एक खाली इंटरफ़ेस को शुद्ध रूप से कार्यान्वित करते हैं जो कि इस प्रकार के इंटरफेस के साथ "चिह्नित" है या नहीं यह जाँचने के लिए इंटरफ़ेस प्रकार का उपयोग करने में सक्षम है।
आप कार्यान्वित इंटरफेस के बजाय विरासत में मिली कक्षाओं का उपयोग कर रहे हैं, लेकिन लक्ष्य समान है, इसलिए मैं इसे "चिह्नित वर्ग" के रूप में संदर्भित करने जा रहा हूं।
अंकित मूल्य पर, मार्कर इंटरफेस / कक्षाओं के साथ कुछ भी गलत नहीं है। वे वाक्यात्मक रूप से और तकनीकी रूप से मान्य हैं, और उनका उपयोग करने के लिए कोई अंतर्निहित कमियां नहीं हैं बशर्ते कि मार्कर सार्वभौमिक रूप से सच हो (संकलन के समय) और सशर्त नहीं ।
ठीक यही है कि आपको अलग-अलग अपवादों के बीच अंतर करना चाहिए, तब भी जब उन अपवादों में आधार विधि की तुलना में कोई अतिरिक्त गुण / विधियां नहीं होती हैं।
इसलिए ऐसा करने में स्वाभाविक रूप से कुछ भी गलत नहीं है, लेकिन मैं यह सावधानी से उपयोग करने की सलाह दूंगा, जिससे यह सुनिश्चित हो जाएगा कि आप बुरी तरह से डिज़ाइन किए गए बहुरूपता के साथ मौजूदा वास्तु दोष को कवर करने की कोशिश नहीं कर रहे हैं।
OrderDateInfo
उन लोगों से एस के लिए प्रासंगिक हैं जो अन्यNamedEntity
एस के लिए प्रासंगिक हैं