【发布时间】:2011-07-06 13:23:15
【问题描述】:
我有一个关于继承的问题,所以我将描述下面的场景:
我正在阅读一个包含日志的文本文件。 (每行一个日志) 每个日志行将具有以下格式: "日期类型说明"
但是,根据日志的“类型”,我将不得不以不同的方式解析“描述”并提取不同的字段。
以下是一些示例:
5/1/2011 Information Field1, Field2, Field3
5/2/2011 Error Field1
--
所以,我试图做的是:
- 从日志中取出一行
-根据模式“日期类型描述”解析它
-查看“类型”字段,并根据需要创建新对象/解析描述
public class Log
{
public DateTime Date;
public String Type;
public String Description;
public Log(String line)
{
this.Date = GetDate();
this.Type = GetType();
this.Description = GetDescription();
}
}
public class InformationLog : Log
{
public String Field1;
public String Field2;
public String Field3;
public InformationLog(Log log)
{
this.Field1 = GetField1(log.Description);
this.Field1 = GetField2(log.Description);
this.Field1 = GetField3(log.Description);
}
}
public class Client
{
public void Main()
{
String line = ReadFileAndGetLine(); // Get a line from the file
Log log = new Log(line);
if(log.Type == "Information")
log = new InformationLog(log); // Is this right?
}
}
这可以按我的意愿工作,但似乎这不是一个好习惯。 “log”变量将自己用作自己构造函数的参数。
我的问题是: 有这样做的标准方法吗?或者,这个实现有什么问题吗?
--
编辑:
另外,我应该提一下:我的理由是我会解析该行以获取日期和类型,然后再次解析以获取更详细的信息。
我决定使用继承,这样我就不必两次解析 Date 和 Type 字段。
【问题讨论】:
-
为什么不直接使用
Log进行条件解析? -
@Mr.失望:每种类型的日志都有不同的参数,所以我不想放“Field1,Field2,Field3等”。 “日志”中的对象(如果不需要)。
-
赞赏,但如果它们总是包含
Type和Description,那么这仍然可以在基类中发生。 -
你不能做得很好,因为你每个新的日志扩展都会提供自己拥有的字段。在您的示例中,您无法获取 FieldX 值,因为“log”是基本类型。
-
你试过log4net吗?它是一个很棒的第 3 方日志记录工具。
标签: c# .net inheritance multiple-inheritance