当我尝试实现以下代码时
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>
,反之亦然,非泛型类型。
答案 0 :(得分:5)
您可以以不同方式拆分接口,以便非通用接口不会公开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();
}
答案 1 :(得分:2)
您需要实施这两者,因为您同时实施了IJob<T>
和IJob
。使用new
不意味着您不必实现基础 - 这意味着您需要显式实施其中一种方法,否则就会碰撞在具体的类中,new
隐藏基本成员,它不会覆盖它。对于接口,它意味着&#34;我想添加与基本方法具有相同签名的另一个方法。实现者仍然需要实现这两者,但现在必须明确地实现除了一个。
如果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();
}
或只是&#34;链接&#34;这两种方法:
bool IJob<bool>.Trigger()
{
// do something and return a bool
}
public void Trigger()
{
(IJob<bool>(this)).Trigger(); // ignore the return value
}