यह केवल उपभोक्ता से वास्तविक कार्यान्वयन को छिपाने के लिए है जो इसे उपभोग करता है।
- यह विशेष कार्यों के लिए concerete कार्यान्वयन प्रदान करता है और यह सीधे
- यह instantiated नहीं किया जा सकता है केवल कक्षाएं उन लागू कर रहे हैं से पहुँचा जा जाएगा।
- इसलिए व्युत्पन्न वर्ग का उपभोग करने वाले ग्राहक, कभी भी कार्यक्षमता के कार्यान्वयन को नहीं जानते हैं क्योंकि इसका abstratced है।
अब आप पूछेंगे कि हमें इसकी आवश्यकता क्यों है, क्योंकि इंटरफेस एक ही तंत्र की सेवा करते हैं ..सरल लकड़हारा उदाहरण
interface ILogger
{
string PrepareLog(System.Exception ex);
void InitializeLogger(string Type);
int WriteLog(string msg);
}
किसी भी प्रवेश ग्राहक को लागू करता है इस इंटरफेस यह सब कार्यक्षमता
class EventLogger : ILogger
{
public override void InitializeLogger(string Type)
{
//Event Logger Initialize
}
public override int WriteLog(string msg)
{
//Write to event log
return 1;
}
public override string PrepareLog(System.Exception ex)
{
return ex.StackTrace ;
}
}
class FileLogger : ILogger
{
public override void InitializeLogger(string Type)
{
}
public override int WriteLog(string msg)
{
//Write to File
return 1;
}
public override string PrepareLog(System.Exception ex)
{
return ex.StackTrace ;
}
}
class MailLogger : ILogger
{
public override void InitializeLogger(string Type)
{
}
public override int WriteLog(string msg)
{
//Write to mail
return 1;
}
public override string PrepareLog(System.Exception ex)
{
//prepare HTML Formatted msg
return ex.StackTrace ;
}
}
को लागू करना चाहिए और कक्षाओं EventLogger, FileLogger और maillogger लागू करता iLogger के माध्यम से जाओ और संदर्भ विशिष्ट कार्यान्वयन देता है । अब हम PrepareLog के वास्तविक कार्यान्वयन को छिपाना चाहते थे और यह अपवाद ऑब्जेक्ट से लॉग संदेश तैयार करने का सामान्य संचालन करेगा।
हमारे वर्तमान कार्यान्वयन में हमारे पास एक विधि को ठोस बनाने और दूसरों को सिर्फ अनुबंध होने का विकल्प नहीं है।
तो सार कक्षाएं
abstract class AbstractLogger:ILogger
{
#region ILogger Members
public virtual string PrepareLog(System.Exception ex)
{
return ex.StackTrace;
}
public abstract void InitializeLogger(string Type);
public abstract int WriteLog(string msg);
#endregion
}
class EventLogger : AbstractLogger
{
public override void InitializeLogger(string Type)
{
//Event Logger Initialize
}
public override int WriteLog(string msg)
{
//Write to event log
return 1;
}
}
class FileLogger : AbstractLogger
{
public override void InitializeLogger(string Type)
{
}
public override int WriteLog(string msg)
{
//Write to File
return 1;
}
}
class DBLogger : AbstractLogger
{
public override void InitializeLogger(string Type)
{
}
public override int WriteLog(string msg)
{
//Write to DB
return 1;
}
}
class MailLogger : AbstractLogger
{
public override void InitializeLogger(string Type)
{
}
public override int WriteLog(string msg)
{
//Write to mail
return 1;
}
public override string PrepareLog(System.Exception ex)
{
//prepare HTML Formatted msg
return ex.StackTrace ;
}
}
अब मैं AbstractLogger वर्ग जो iLogger से विरासत और अकेले लागू किया PrepareLog विधि बनाया है साथ कार्यान्वयन थोड़ा परिवर्तित करने देता है, remainig तरीकों सार छोड़ दिया है। इसलिए उपभोक्ता उनके कार्यान्वयन में संदर्भ विशिष्ट कोड लिखेंगे।
तो अब किसी भी लॉगर्स को शुरू करने वाले कोसमर्स से प्रीपेरलॉग विधि पूरी तरह छिपी हुई (लॉग तैयारी का अर्थ)।
तो क्यों PrepareLog वर्चुअल एड है ??
ऐसे परिदृश्य हैं जो उपभोक्ता तैयार करने की विधि को ओवरराइड करना चाहते हैं, पूर्व: मेललॉगर प्रीपेरलॉग को ओवरराइड करेगा और मेल संदेशों को आपूर्ति करने के लिए HTML प्रारूपित आउटपुट प्रारूपित करेगा।
संक्षिप्त उत्तर, विरासत सीखें। – pstanton
@pstanton: मैं क्या कर रहा/करने की कोशिश कर रहा हूँ !!! :- डी –
@pstanton: मैं यह देखने में असफल रहा कि ओपी को उन प्रश्नों से पूछने के लिए कह रहा है जो उन्होंने पहले से ही पूछे हैं, एक जवाब है। –