仅使用泛型接口方法

本文关键字:方法 泛型接口 | 更新日期: 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();
    }
}

我必须实现TriggerTrigger<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
}