Matlab-将枚举类与非静态方法相结合



我正在尝试将枚举类与Matlab中的非静态方法相结合。我希望创建一个"LogEvent"类,该类具有函数"log",该函数将枚举成员(如LogEvent.INFO、LogEvent.ERROR或LogEvent.WARNING)和字符串作为输入参数,以便将此消息附加到文件中。我希望为不同的程序重复使用这个LogEvent类,因此该类具有在构造过程中指定的属性"fileName",并引用输出文件。以下是构成我的classdef文件的代码:

classdef LogEvent
%Class definition for logging events.
properties
    fileName;
end
methods
    function obj = LogEvent(outFile)
        obj.fileName = outFile;
    end
    function log(obj,type,logStr)
        switch (type)
            case LogEvent.INFO
                typeStr = 'INFO';
            case LogEvent.WARNING
                typeStr = 'WARNING';
            case LogEvent.ERROR
                typeStr = 'ERROR';
        end
        FID = fopen(obj.fileName,'a');
        Str = sprintf('%s - %s: %sn',datestr(now),typeStr,logStr);
        fprintf(FID,Str);
        fclose(FID);
    end
end
enumeration
    INFO,
    WARNING,
    ERROR
end
end

现在无可否认,我没有太多编程经验,所以我可能会以完全错误的方式处理这个问题,尽管我尝试过在谷歌上搜索这个问题,但收效甚微——我可能不知道一些特定的关键词会"一针见血"。不过,我认为,因为需要创建此类的多个实例(以引用不同的文件),所以"log"函数需要是非静态的。我在尝试创建此类的实例时收到了以下错误消息:

Error using LogEvent
While creating an instance of class 'LogEvent':
No value has been provided for the enumeration member named 'INFO'.  For an
enumeration derived from a built-in class, a value must be provided for each
enumeration member.
Error in ZOHB (line 10)
obj.Log = LogEvent('ZOHB.log');

在"ZOHB"类中,我尝试创建LogEvent类的实例,并将其分配为ZOHB类的属性。

在Matlab的枚举方案中,枚举值必须是包含枚举的类的实例。因此,例如WARNING将必须具有某个LogEvent实例。

例如,如文档中的示例:

classdef Bearing < uint32
   enumeration
      North (0)
      East  (90)
      South (180)
      West  (270)
   end
end

这意味着在您的情况下,您必须指定适合LogEvent构造函数的参数——这基本上就是错误消息所说的。当然,在您的用例中,这完全是无稽之谈。

在您的特殊情况下,您最好使ERRORWARNINGINFO的属性为常数:

properties (Constant)
    INFO = 1;
    WARNING = 2;
    ERROR = 3;
end

您可以以静态方式访问常量,因此您剩余的代码应该可以与此版本配合使用。

最新更新