インターフェイスを実装するために型パラメータを使用する基本クラスを使用し、クラスを継承してDRYを維持するという興味深い状況があります。指定された型のインターフェイスの汎用実装
public interface ICalculator
{
void Process(ICalculationModel calculationModel);
}
public abstract class CalculatorBase<T> :ICalculator where T : ICalculationModel
{
// Compiler moans that Process(ICalculationModel calculationModel) isn't implemented
public abstract void Process(T calculationModel);
}
public class PipeworkInspections : CalculatorBase<GasSafetyModel>
{
public override void Process(GasSafetyModel documentModel){
//snip
}
}
ここでは、どこの句で何かが分からないのですか?私の頭の中でこれはうまくいくはずです。あるいは、コンパイラはインタフェース定義と同じ実装を正確に必要としますか?
タイプパラメータをICalculatorに簡単に移動することはできません。場所の数が多いため、ジェネリックの要件がなくても使用されます。
これで解決しました。情報をありがとう。今や明らかに解決策は、インタフェースが型パラメータを取るようにすることです。しかし、ICalculatorはいくつかの場所で使用されていて、ちょうどICalculator
として参照されています。ICalculatorを参照するインタフェースの型パラメータを省略すると、コンパイラエラーが発生します。
「ICalculator」での表示方法と同じである必要があります。しかし、私は主にJavaのものでC#ではなく、私は確かにそれを言うことはできません。 – Powerlord
これはあなたが 'ICalculator c = new PipeworkInspections();を実行することができたので機能しません。 c.Process(新しいOtherModel()) 'は安全ではありません。あなたができることは、 'ICalculator.Process'を暗示し、汎用実装の中にキャストすることです。 – Lee