kra*_*s88 3 .net c# overriding c#-4.0
目前我有一个错误记录类,如下所示:
public class Log
{
public enum LogTypes
{
Info = 1,
Error = 2,
Warning = 3
}
public string Message { get; set; }
public LogTypes LogType { get; set; }
public Log(string Message, LogTypes LogType)
{
this.Message = Message;
this.LogType = LogType;
}
Run Code Online (Sandbox Code Playgroud)
我有一个新列表的初始化器:
List<Log> LogList = new List<Log>();
Run Code Online (Sandbox Code Playgroud)
我该如何使用LogList.Add(Message, LogType)
而不是LogList.Add(new Log(Message, LogType));
?
我知道这是一个小小的改变,但我仍在学习C#,我很好奇.谢谢!
首先,我不会这样做.这不是任何人使用a List<Log>
期望的.而不是暴露平原List<Log>
,考虑创建一个Logger
类或类似的东西,其包含一个List<Log>
暴露了一个Log(string message, LogType type)
方法,但实际上并不暴露List<Log>
.
如果您真的希望能够Add(message, type)
直接在列表上打电话,有两种选择:
创建一个派生自的新类List<Log>
:
public LogList : List<Log>
{
public void Add(string message, LogType type)
{
Add(new Log(message, type));
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,这是重载(添加新方法签名但具有相同名称Add
),而不是覆盖(为方法的现有签名方法提供新行为virtual
) - 并且您需要创建实例LogList
而不是List<Log>
:
LogList list = new LogList();
list.Add(message, type);
Run Code Online (Sandbox Code Playgroud)添加扩展方法List<Log>
,这将有效地将该方法添加到所有 List<Log>
实例.
public static LogListExtensions
{
public static void Add(this Log<List> list, string message, LogType type)
{
list.Add(new Log(message, type));
}
}
Run Code Online (Sandbox Code Playgroud)顺便说一句,我可能也会从你的Log
类型中删除setter - 为什么你需要能够在构造后更改消息或类型?
归档时间: |
|
查看次数: |
4313 次 |
最近记录: |