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は、はとは異なるものにすることができますが、それに準拠する必要ISchedulerConfigProviderがあります。T1また、このProcessメソッドはタイプパラメータを使用していません(そして、そうあるべきであるように見えます)。なぜそうなるのか、私には完全には明らかではありません。これが意図的なものである場合は、説明を提供してください。

もう1つのオプションは、1つの不変型パラメーターのみを提供することです。

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);
}

さらに別のオプションは、インターフェースを2つに分離することです。1つは上の共変メソッドT用、もう1つは反変メソッド用です。

于 2012-07-02T21:33:04.587 に答える