異なる抽象レベルのクラスを作成しようとしています。ここではVectorの例を使用します。インターフェイスよりも派生クラスを返す指定
私の目標は、自分のクラスのユーザーが使用する抽象化のレベルを選択できるということです。つまり、より派生したクラスを使用する場合と使用しない場合があります。
interface IVector
{
Vector A();
}
interface ISparseVector : IVector
{
new SparseVector A();
}
今、私は、次のようなクラスを実装:
class Vector : IVector
{
public Vector A() { return new Vector(); }
}
class SparseVector : Vector,ISparseVector
{
public new SparseVector A() { return new SparseVector(); }
}
これは、すべての罰金とダンディです。しかし、基本クラスが以下のような抽象クラスの場合:
abstract class Vector : IVector
{
public abstract Vector A();
}
class SparseVector : Vector,ISparseVector
{
public SparseVector A() { return new SparseVector(); } // Hides abstract member.
}
派生したメソッドがVectorの抽象メソッドを隠していると言うコンパイルエラーが発生します。これを回避する方法の考えですか?
あなたは、とにかくそれを解決するためのハックがあるかどうかを以下の回答に尋ねました:私は1つを見つけました(一般的な共分散を使用しています)。残念ながら、あなたの戻り値の型があなたの特定のケースでは役に立たないので、クラスを囲んでいます。 –