जैसा कि बताया गया है, आप यह नहीं कर सकते हैं और अच्छे कारण हैं कि आपको क्यों नहीं करना चाहिए।
जिस विधि में मैंने अतीत में लागू किया है वह एक इंटरफ़ेस और एक सार आधार वर्ग बनाता है जो इंटरफ़ेस लागू करता है। ऐसा कुछ दिखता है:
public interface IMyCompanySetting
{
XmlNode Serialize();
IMyCompanySetting Deserialize(XmlNode pattern);
string SettingName { get; }
स्ट्रिंग कुंजी {प्राप्त करें; } ऑब्जेक्ट सेटिंग वैल्यू {प्राप्त करें; सेट; } सेटिंगस्कोप स्कोप {प्राप्त करें; सेट; } }
public abstract class MyCompanySettingBase : IMyCompanySetting
{
public MyCompanySettingBase() {}
public MyCompanySettingBase(XmlNode pattern)
{
Deserialize(pattern);
}
#region IMyCompanySetting Members
public abstract XmlNode Serialize();
public abstract IMyCompanySetting Deserialize(XmlNode pattern);
public abstract string SettingName{ get; }
public abstract string Key { get; }
public abstract SettingScope Scope{ get; set; }
public abstract object SettingValue{ get; set; }
#endregion
public static XmlNode WrapInSettingEnvelope(XmlNode innerNode, IMyCompanySetting theSetting)
{
// Write the top of the envelope.
XmlTextWriter xtw = null;
MemoryStream theStream = OpenSettingEnvelope(theSetting, ref xtw);
// Insert the message.
xtw.WriteNode(new XmlTextReader(innerNode.OuterXml, XmlNodeType.Element, null), true);
// Close the envelope.
XmlNode retNode = CloseSettingEnvelope(xtw, theStream);
return retNode;
}
public static MemoryStream OpenSettingEnvelope(IMyCompanySetting theSetting, ref XmlTextWriter theWriter)
{
MemoryStream theStream = new MemoryStream();
theWriter = new XmlTextWriter(theStream, Encoding.ASCII);
System.Type messageType = theSetting.GetType();
string[] fullAssembly = messageType.Assembly.ToString().Split(',');
string assemblyName = fullAssembly[0].Trim();
theWriter.WriteStartElement(theSetting.SettingName);
theWriter.WriteAttributeString("type", messageType.ToString());
theWriter.WriteAttributeString("assembly", assemblyName);
theWriter.WriteAttributeString("scope", ConfigurationManager.ScopeName(theSetting.Scope));
return theStream;
}
public static XmlNode CloseSettingEnvelope(XmlTextWriter xtw, MemoryStream theStream)
{
XmlDocument retDoc = new XmlDocument();
try
{
// Close the envelope.
xtw.WriteEndElement();
xtw.Flush();
// Return the node.
string xmlString = Encoding.ASCII.GetString(theStream.ToArray());
retDoc.LoadXml(xmlString);
}
catch (XmlException)
{
string xmlString = Encoding.ASCII.GetString(theStream.ToArray());
Trace.WriteLine(xmlString);
retDoc.LoadXml(@"<error/>");
}
catch (Exception)
{
retDoc.LoadXml(@"<error/>");
}
return retDoc.DocumentElement;
}
}
स्रोत
2009-01-14 22:10:24
मुझे लगता है कि ओपी का मतलब कुछ अलग था। मैं निम्नलिखित प्रश्न को समझता हूं: "सिंगलटन क्लास के लिए इंटरफ़ेस विवरण कैसा दिखता है?" –
आप एक इंटरफ़ेस से सिंगलटन क्लास निर्दिष्ट नहीं कर सकते हैं क्योंकि एक इंटरफ़ेस केवल एक अनुबंध निर्दिष्ट करता है जो कार्यान्वयन वर्ग किसी भी तरह फिट बैठता है। –
सीएफ़ में AFAIK एक इंटरफ़ेस में स्थिर सदस्य नहीं हो सकता है। हालांकि, ऐसे उदाहरण हैं जिनमें एक स्थिर सदस्य उपयोगी होता। उदाहरण के लिए, आप कार्यान्वयन का अनुबंध चाहते हैं लेकिन उन सभी कार्यान्वयन को क्लासिफायर की आवश्यकता होती है जिसे ऑब्जेक्ट के उदाहरणों के बीच साझा किया जाता है। यह पहली बार नहीं हुआ है कि मुझे ऐसी चीज की आवश्यकता है। –