1

实现独立调度器类我不得不来如下接口:

public interface ISchedulableContext<in T1, out T2> where T1: T2, ISchedulerConfigProvider
{
    void LogMessage(LoggingEventLevel level, string eventName, string Message);
    void Process(ISchedulerConfigProvider schedulerConfig);
    IEnumerable<T2> GetSchedulerConfig();
    void SaveUpdatedConfig(IEnumerable<T1> schedulers);
}

它可以工作,但确实需要明确和冗余地指定和传递类型 ISchedulableContext<ISchedulerConfigProvider,ISchedulerConfigProvider>

public class SchedulableCore: ISchedulableContext<ISchedulerConfigProvider,ISchedulerConfigProvider>
{ 
...
}

public class TaskScheduler
{
    private ISchedulableContext<ISchedulerConfigProvider, ISchedulerConfigProvider> core;

    public TaskScheduler(ISchedulableContext<ISchedulerConfigProvider, ISchedulerConfigProvider> core)
    {
        this.core = core;
    }
}

我想简化这种实现并改用简单的接口实现:

public class SchedulableCore: ISchedulableContext
{ 
    /*...*/
    public IEnumerable<ISchedulerConfigProvider> GetSchedulerConfig()
    {
        return (IEnumerable<ISchedulerConfigProvider>)/*...*/;
    }

    public void SaveUpdatedConfig(IEnumerable<ISchedulerConfigProvider> schedulers)
    { /*...*/ }
}

是否可以简化?

4

1 回答 1

1

由于您使用接口作为类型参数,因此您可以使用接口本身而不是类型参数:

public interface ISchedulableContext {
  void LogMessage(LoggingEventLevel level, string eventName, string Message);
  void Process(ISchedulerConfigProvider schedulerConfig);
  IEnumerable<ISchedulerConfigProvider> GetSchedulerConfig();
  void SaveUpdatedConfig(IEnumerable<ISchedulerConfigProvider> schedulers);
}

请注意,这并不等同于您发布的内容。在您的示例中,T2可以与 a 不同ISchedulerConfigProvider,但T1必须遵守它。此外,该Process方法没有使用任何类型参数(看起来应该如此)。我并不完全清楚为什么会这样。如果这是故意的,也许您可​​以提供一些解释。

另一种选择是只提供一个不变的类型参数:

public interface ISchedulableContext<T> where T : ISchedulerConfigProvider {
  void LogMessage(LoggingEventLevel level, string eventName, string Message);
  void Process(T schedulerConfig);
  IEnumerable<T> GetSchedulerConfig();
  void SaveUpdatedConfig(IEnumerable<T> schedulers);
}

另一种选择是将接口分成两部分:一个用于 上的协变方法T,另一个用于逆变方法。

于 2012-07-02T21:33:04.587 回答