我对代表有一些问题
我的课程方案:
public interface IWorker<T> where T : IModel
{
T Do(T model);
T ReadyToWork(T model);
}
public abstract class Workers<T> : IWorker<T> where T : IModel
{
public abstract T Do(T model);
public abstract T ReadyToWork(T model);
}
班上班! FirstModel : IModel
public class FirstWorker : Workers<ModelFirst>
{
public override ModelFirst Do(ModelFirst model)
{
return new ModelUserFirst();
}
public override ModelFirst ReadyToWork(ModelFirst model)
{
throw new NotImplementedException();
}
}
我可以创建许多工作特殊类,并且为了使用它们,我创建了一个访问点:
public class WorkPoint<T> where T : IModel
{
public static Func<T, T> Do { get; set; }
public static Func<T, T> ReadyToWork{ get; set; }
public WorkPoint(ModelFirst mod)
{
Do = FirstWorker.Instance().Do;
ReadyToWork= FirstWorker.Instance().ReadyToWork;
}
}
好的,还有问题。时刻分配Do
和ReadyToWork
我发现错误
错误CS0123没有过载&#39;做&#39;匹配委托&#39; Func&#39;
怎么了?
答案 0 :(得分:0)
这不是最优雅的解决方案,但这有效:
Main.iniciaServico()
由于创建了额外的类,这将增加一些开销,但它应该作为注释中指出的协方差问题的解决方法。
这样你就可以做到:
public class WorkPoint<T> where T : IModel
{
public Func<T, T> Do { get; }
public Func<T, T> ReadyToWork { get; }
protected WorkPoint(Func<T, T> f, Func<T, T> r)
{
Do = f;
ReadyToWork = r;
}
}
// Create a simple class like this for evert worker type you need
public class FirstWorkPoint : WorkPoint<ModelFirst>
{
private FirstWorkPoint() :
base(FirstWorker.Instance().Do, FirstWorker.Instance().ReadyToWork)
{ }
// Public method to get a new base instance
public static WorkPoint<ModelFirst> New() => new FirstWorkPoint();
}
编辑:另外,如果你不需要那个基类WorkPoint<ModelFirst> point = FirstWorkPoint.New();
类我会说你可以摆脱它并让实际的工人类直接从你的界面继承。毕竟,基类在上面的代码中没有提供任何附加功能。