C# 避免";通过派生类型访问类型的静态成员;
我相信这纯粹是一个再竖琴警告,但背后的理由(解释)是很有道理的。所说的是,您可以从同级类调用基类静态方法。。。在他的例子中,他使用了:C# 避免";通过派生类型访问类型的静态成员;,c#,inheritance,static,static-methods,C#,Inheritance,Static,Static Methods,我相信这纯粹是一个再竖琴警告,但背后的理由(解释)是很有道理的。所说的是,您可以从同级类调用基类静态方法。。。在他的例子中,他使用了: var request = (FtpWebRequest)HttpWebRequest.Create(...) 。。。这是误导 那么,有没有一种设计可以让我在下面的课程中避免这个警告呢 public abstract class BaseLog { // I omitted several other properties for clarity
var request = (FtpWebRequest)HttpWebRequest.Create(...)
。。。这是误导
那么,有没有一种设计可以让我在下面的课程中避免这个警告呢
public abstract class BaseLog {
// I omitted several other properties for clarity
protected static string category;
protected static TraceEventType severity;
static BaseLog() {
category = "General";
severity = TraceEventType.Information;
}
public static void Write(string message) {
Write(message, category, severity);
}
// Writes to a log file... it's the same code for
// every derived class. Only the category and severity will change
protected static void Write(string message, string messageCategory, TraceEventType messageSeverity) {
LogEntry logEntry = new LogEntry(message, messageCategory, messageSeverity);
// This is Microsoft's static class for logging... I'm wrapping it to
// simplify how it's called, but the basic principle is the same:
// A static class to log messages
Logger.Write(logEntry);
}
}
public class ErrorLog : BaseLog {
static ErrorLog() {
category = "Errors";
severity = TraceEventType.Error;
}
// I can add more functionality to the derived classes, but
// the basic logging functionality in the base doesn't change
public static void Write(Exception exc) {
Write(exc.Message);
}
}
// Code that could call this...
catch (Exception exc) {
// This line gives me the warning
ErrorLog.Write("You did something bad");
ErrorLog.Write(exc);
}
一个错误日志服务于应用程序,其设置永远不会更改(还有一个TraceLog和一个ThreadLog)。我不想重复日志代码,因为它对于每个派生类都完全相同。。。将其保存在BaseLog中非常有效。那么,我如何设计这个,使我不违反这个设计原则呢
这些类是静态的,因为我不想每次我想记录一些东西时都实例化一个新的ErrorLog
对象,也不想在我编写的每个类中有50个以成员级变量的形式浮动。日志记录使用的是微软的企业库,如果这有区别的话
蒂亚詹姆斯你似乎想让门保持打开状态以进行扩展,而不是为了修改“开-关”原则。这是一个值得追求的目标 我的建议是放弃静态粘附——将函数持有者类转换为对象。这允许您根据需要重写(而不是混淆其他读取器)-多态性仅适用于实例 下一个问题是需要一个全局对象,而不是传递一个记录器实例创建另一种类型,该类型提供对记录器对象的单个实例的访问。(老单身汉)
PS:免费赠品-也更容易测试这些对象。有趣的方法。。。今天晚上我要好好想想。因此,如果我没有弄错的话,
ErrorLogProvider
将是一个静态类,其中包含类型为ErrorLog
的静态成员变量,该变量将在提供程序的静态构造函数中实例化,并通过实例
公开property@James-是的。ErrorLogProvider负责提供对(缓存?)记录器对象的访问。此方法的返回类型可以是基类型-允许客户端不关心记录器的确切类型。ErrorLogProvider可以基于配置文件/DI/显式初始化方法设置正确类型的记录器。。。
e.g. ErrorLogProvider.Instance.Write(something)