继承调用其派生父方法的静态方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了继承调用其派生父方法的静态方法相关的知识,希望对你有一定的参考价值。

我正在尝试编写一个像这样工作的日志类:

Log.Info("Something happened");  

Log.Error("Something else happened");

Log.Debug("Yet another thing happened!");  

它应该可以从命名空间的每个部分访问并快速编写,所以我认为最好将它设置为静态。这样就可以避免为了记录消息而创建对象。

此时它有点像Console.WriteLine();

但是,我希望它能够有两种不同的模式:LogToConsole和LogToFile。

因此,以下语法将是最方便的:

LogConsole.Info("This will display in the console");  

LogFile.Debug("This will be saved to a file");  

LogAll.Error("This will be saved to a file AND displayed in a console");  

但是,我意识到可能会有大量的“模式”乘以非常大量的“logtypes”。

我怎样才能有效地做到这一点,我只需要编写一次每个logtype方法,并根据调用方法的派生类,动作发生或动作b发生?

理想情况下,我想一次定义所有方法,然后创建继承它们的类。但是,由于它们是静态方法,因此它们的行为始终是相同的。我无法告诉他们:“找出你的超类是什么,并执行该类的'SaveLog()方法”。

我意识到使用抽象类会非常容易,但是我必须创建对象。

有什么方法可以在C#中做到这一点吗?

谢谢!

答案

像Boo一样,也会推荐像log4net这样的记录器。

如果你想自己编写它,我建议不要使用静态方法,因为它们会阻止你测试调用它的类/方法的能力。而是将ILogger接口注入可能需要记录的所有类。然后将“模式”与目标分开,这样就可以将一组目标注入记录器。

public interface ILogTarget
{
    void Save(string message);
}

public class LogToFile : ILogTarget
{
    public void Save(string message)
    {
        //
    }
}


public class LogToConsole : ILogTarget
{
    public void Save(string message)
    {
        //
    }
}

public interface ILogger
{
    void Debug(string message);
}

public class Logger : ILogger
{
    private readonly List<ILogTarget> _targets;
    private static Logger _logger;

    public Logger(List<ILogTarget> targets)
    {
        _targets = targets;
    }

    public void Debug(string message)
    {
        foreach (var target in _targets)
            target.Save($"Debug: {message}");
    }

}

public class TheClassThatMakesTheCall
{
    private readonly ILogger _logger;

    public TheClassThatMakesTheCall(ILogger logger)
    {
        _logger = logger;
    }

    public void AMethod()
    {
        _logger.Debug("some message");
    }
}

//In your IoC, register Logger as a type of ILogger, and pass in the targets that you want
//If your target vary per situation, you'll need a ILogTarget factory that returns a different list of loggers based on the situation
另一答案

您不能从静态类继承。但是你可以让这些函数只是静态的。不要将类设为静态。只需将函数设置为静态,然后就可以在派生类中使用“new”关键字。这将是这样的

// IF this is your base class
public class Log
{
    public static bool Info(string Message)
    {
        Console.WriteLine(Message + " From Log");
        return true;
    }

    public static bool Success(string Message)
    {

        return true;
    }

    public static bool Error(string Message)
    {
        return true;
    }
}

//Then this can be your derived class
public class LogFile : Log
{
    public static new bool Info(string Message)
    {
        Console.WriteLine(Message + " From LogFile");
        return true;
    }

    public static new bool Success(string Message)
    {
        return true;
    }

    public static new bool Error(string Message)
    {
        return true;
    }
}

希望这可以帮助。

以上是关于继承调用其派生父方法的静态方法的主要内容,如果未能解决你的问题,请参考以下文章

继承与派生

第五周学习总结

C++编程中 子类(派生类)能不能重写父类(基类)的函数(方法),除了虚函数?

面向对象:继承抽象类抽象方法虚方法

C++通过其派生类对象调用公共父类方法

子类将继承父类所有的方法和属性吗?为啥?