仅使用泛型接口方法
本文关键字:方法 泛型接口 | 更新日期: 2023-09-27 18:18:35
当我尝试实现以下代码
public interface IJob
{
TimeSpan Interval { get; set; }
DateTimeOffset StartTime { get; set; }
int Priority { get; set; }
bool Repeat { get; set; }
bool Enabled { get; set; }
void Trigger();
}
public interface IJob<out T> : IJob
{
new T Trigger();
}
这样的public class EmployeeJob : IJob<bool>
{
bool IJob<bool>.Trigger()
{
throw new NotImplementedException();
}
public void Trigger()
{
throw new NotImplementedException();
}
}
我必须实现Trigger
和Trigger<bool>
方法,而我只需要Trigger<bool>
在这种情况下,反之亦然非泛型。
您可以以不同的方式拆分接口,以便非泛型接口不会暴露void Trigger()
方法:
public interface IJobBase
{
TimeSpan Interval { get; set; }
DateTimeOffset StartTime { get; set; }
int Priority { get; set; }
bool Repeat { get; set; }
bool Enabled { get; set; }
}
public interface IJob : IJobBase
{
void Trigger();
}
public interface IJob<out T> : IJobBase
{
T Trigger();
}
您需要同时实现它们,因为您同时实现IJob<T>
和IJob
。使用new
并不意味着不意味着你不需要实现基础-这意味着你需要显式地实现其中一个方法,否则会有冲突。在具体类中,new
隐藏基成员,它不重写基成员。对于接口,这意味着"我想添加另一个与基方法具有相同签名的方法"。实现者仍然需要实现两者,但现在必须显式地实现除一个之外的所有。
如果Trigger
是唯一具有通用和非通用口味的函数,那么它们可能在正交接口中:
public interface IJobBase
{
TimeSpan Interval { get; set; }
DateTimeOffset StartTime { get; set; }
int Priority { get; set; }
bool Repeat { get; set; }
bool Enabled { get; set; }
}
public interface IJob : IJobBase
{
void Trigger();
}
public interface IJob<out T> : IJobBase
{
T Trigger();
}
或者直接"链接"这两个方法:
bool IJob<bool>.Trigger()
{
// do something and return a bool
}
public void Trigger()
{
(IJob<bool>(this)).Trigger(); // ignore the return value
}