あなたがこれを持っていると仮定します:
// General purpose
public interface ISerializer
{
IDataResult Serialize<T>(T instance);
}
// General purpose
public interface IDataResult
{
}
// Specific - and I implement IDataResult
public interface IMyCrazyDataResult : IDataResult
{
}
public class MyCrazySerializer : ISerializer
{
// COMPILE ERROR:
// error CS0738: 'MyCrazySerializer' does not implement interface member 'ISerializer.Serialize<T>(T)'.
// 'MyCrazySerializer.Serialize<T>(T)' cannot implement 'ISerializer.Serialize<T>(T)' because it does
// not have the matching return type of 'IDataResult'.
public IMyCrazyDataResult Serialize<T>(T instance)
{
throw new NotImplementedException();
}
}
なぜこのコンパイルエラーが発生するのですか? 私はインターフェイスを尊重しています - 実際には、間接的ではありますが IDataResult を返します。コンパイラがそれを理解できないということですか、それとも根本的に (OO レベルで) 何か間違っているのでしょうか?
インターフェイスを持つことの全体的なポイントは、何らかの実装を保証できることであると考えていましたが、それをアドオンできるように開いたままにしておきます。それが私がやっていることですが、コンパイルエラーが発生します。
実際のコードでは、派生インターフェイスにいくつかの追加メソッドがあるため、戻り値の型をもう少し具体的にしたいと考えています。IDataResult 型の MyCrazySerializer.Serialize の戻り値の型を作成すると、intellisense は私と、より具体的なインターフェイスを表示したい基本的な共通メソッドを表示するだけです。
他にどうすればこれを達成できますか? このコードの何が問題なのですか???