仅使用通用接口方法

时间:2014-08-19 13:25:30

标签: c#

当我尝试实现以下代码时

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>,反之亦然,非泛型类型。

2 个答案:

答案 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
}