我正在写一个方法一次输出到多个输出流,我现在设置的方法是我有一个LogControllerLogFileLogConsole,后两个是界面。

我现在想做的是向Log添加一个方法,该方法可以附加LogController接口的任何实现。

我要如何执行以下操作:在Log中,我有一个关联数组,在其中存储指向LogController对象的指针。调用LogwriteOut方法时,我希望它随后在数组的元素上运行并也调用它们的LogController方法。我可以做到后者,但事实证明前者很困难。

法师/工具/LogController.d

module Mage.Utility.LogController;

import std.stdio;

interface Log {
    public void writeOut(string s);
}

class LogController {
    private Log*[string] m_Logs;

    public this() {

    }

    public void attach(string name, ref Log l) {
        foreach (string key; m_Logs.keys) {
            if (name is key) return;
        }

        m_Logs[name] = &l;
    }

    public void writeOut(string s) {
        foreach (Log* log; m_Logs) {
            log.writeOut(s);
        }
    }
}


法师/工具/LogFile.d

module Mage.Utility.LogFile;

import std.stdio;
import std.datetime;

import Mage.Utility.LogController;

class LogFile : Log {
    private File fp;
    private string path;

    public this(string path) {
        this.fp = File(path, "a+");
        this.path = path;
    }

    public void writeOut(string s) {
        this.fp.writefln("[%s] %s", this.timestamp(), s);
    }

    private string timestamp() {
        return Clock.currTime().toISOExtString();
    }
}


我已经尝试了附加函数的多种功能,但都没有。构建失败,并出现以下错误:

Mage\Root.d(0,0): Error: function Mage.Utility.LogController.LogController.attach (string name, ref Log l) is not callable using argument types (string, LogFile)


这是关键功能:

public void initialise(string logfile = DEFAULT_LOG_FILENAME) {
    m_Log = new LogController();

    LogFile lf = new LogFile(logfile);
    m_Log.attach("Log File", lf);
}


谁能告诉我我要去哪里错了?我很困惑,我无法在任何地方找到答案。我尝试了多种不同的解决方案,但都无济于事。

最佳答案

D中的类和接口是引用类型,因此Log*是多余的-删除*。同样,不需要在ref中使用ref Log l-就像在C ++中按引用获取指针一样。

这是导致您发布错误消息的原因-通过引用传递的变量的类型必须完全匹配。删除ref应该可以解决该错误。

10-01 08:23