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)