【发布时间】:2020-09-24 13:04:30
【问题描述】:
我有一个带有全参数构造函数的抽象类:
public abstract class LoggerAdapterBase<TLogger>
{
protected readonly TLogger _logger;
public LoggerAdapterBase(TLogger logger){
this._logger = logger;
}
}
在其他类中,我必须创建实现抽象的具体类,但有一个问题:
public class LoggerManager<TLogger, TLoggerAdapter>: ILoggerManager<TLogger> where TLoggerAdapter: LoggerAdapterBase<TLogger>
{
private readonly TLogger _logger;
public LoggerManager(TLogger logger)
{
this._logger = logger;
}
public LoggerAdapterBase<TLogger> CreateLogger(Configuration configuration)
{
return new TLoggerAdapter(this._logger);
//Line above says: Cannot create an instance of the variable type 'TLoggerAdapter' because it does not have the new() constraint
}
}
我不知道为什么编译器需要 new() 约束,因为 LoggerAdapterBase 有一个我使用的构造函数,并且我已经将它指定给约束,它应该看到构造函数以及来自 LoggerAdapterBase 的其他方法。这里有什么问题?
编辑
谢谢你的回答,我已经解决了。我只是制作了接口而不是抽象类并定义了道具 Logger。并添加了约束 new()。现在创建看起来是这样的:
return new TLoggerAdapter() { Logger = _logger };
这不是一个理想的实现,因为从 LoggerManager 创建实例时可能会出现 NullReferenceExceptions,并且意外替换了 prop Logger。
【问题讨论】:
-
C# 类不从其基类继承构造函数。子类可以从自己的构造函数中调用父类的构造函数,但是父类的构造函数不能用来创建子类的实例。
标签: c# .net generics constructor constraints