2012-03-20 13 views
2

TL; DR

私は元のプロパティの派生型を返すように宣言を変更することができるようにインターフェイスでプロパティを隠すと間違って何ですか?派生型を返す派生インターフェイスのプロパティを非表示にすることはできますか?

これは以前に尋ねられたはずのものだと確信していますが、私はそれを見つけることができず、長い質問に対してお詫び申し上げます。

は、私はこのような状況があるとしましょう:

public interface A 
{ 
    B TheB{get;} 
} 

public interface MoreSpecificA : A 
{ 
    MoreSpecificB TheMoreSpecificB{get;} 
} 

public interface B{...} 

public interface MoreSpecificB:B{...} 

私はMoreSpecificAのユーザーがMoreSpecificBあるBで取得できるようにしたいと思います。彼らはTheBを呼び出してキャストしたり、メソッドTheMoreSpecificBを呼び出すことでこれを行うことができます。また、私はそうのようなMoreSpecificAを宣言することができます:

public interface MoreSpecificA : A 
{ 
    new MoreSpecificB TheB{get;} 
} 

今、彼らはちょうど同じ方法を使用してMoreSpecificBを取り戻すことができるように。

方法を隠すためにnewを使用すると、私の歯がエッジに置かれるので、なぜこれは悪い考えですか?ここでやるのは合理的なようです。

多くの場合、一般的な提案は、代わりにジェネリックを使用するように見えますが、これはMoreSpecificAがあり、返品を宣言するメソッドで返すことに問題があるようです私はMoreSpecificAはあなたがA.TheBまたは新しいTheB上を宣言することによって解決することができ

public interface ABase<T> where T : B 
{ 
    T TheB{get;} 
} 

public interface A : ABase<B> 
{   
} 

public interface MoreSpecificA : ABase<MoreSpecificB>,A 
{   
} 

public class blah 
{ 
    public A GetA(MoreSpecificA specificA) 
    { 
     return specificA; //can't do this unless MoreSpecificA extends A 
    } 

    public B GetB(MoreSpecificA specificA) 
    { 
     return specificA.TheB; //compiler complains about ambiguity here, if MoreSpcificA extends A 
    } 
} 

MoreSpecificA.TheBをしたい場合、それはわからないようMoreSpecificAインスタンス上TheBにアクセスする際にあいまいさを与えるAを延長持っている必要がありますタイプその後、AとしてMoreSpecificA(ただし、新たな問題)

MoreSpecificAは、上記blahがようになりましたMoreSpcificAはこれを書いなくなりA.

に変換することはできませんように私は私が私のBaseAを宣言した場合ことに気づいた文句クラスの最初の方法を拡張していない場合その後、私は両方の長所を取得

public class blah 
{ 
    public ABase<B> GetA(MoreSpecificA specificA) 
    { 
     return specificA; 
    } 

    public B GetB(MoreSpecificA specificA) 
    { 
     return specificA.TheB; //compiler complains about ambiguity here 
    } 
} 

する

public interface ABase<out T> where T : B 
{ 
    T TheB{get;} 
} 

と私のクラス:次のように反変します。このソリューションの適用性は、AABaseに何かを追加するかどうかによって異なりますか?

元のメソッドの派生型を返すように、派生型のメソッドを隠すだけの私の元の計画ですか?

+0

私はそれを見ると、複数の継承を持たない制限の1つに陥っているだけです。工場やビルダーのパターンによっては、その日を節約することができます。 – CodingBarfield

答えて

2

または、元のメソッドの派生型を返すように、派生型のメソッドを隠すだけの私の元の計画ですか?

は、それがまったく同じことを手段として、私はそれは大丈夫だと思います。あなたは、例えば(SqlCommandを返す)(IDbCommandを返す)IDbConnection.CreateCommandと標準ライブラリでは、このようなもの、とSqlConnection.CreateCommandを見ることができます。

その場合、IDbConnectionバージョンの明示的なインターフェイスの実装を使用してだが、それは同じ原理です。

また、IEnumerator<T>.CurrentIEnumerator.CurrentIEnumerable<T>.GetEnumerator()IEnumerable.GetEnumerator()の間でも表示されます。

弱い型指定のメソッドの実装がちょうどの場合は、より厳密に型指定されたメソッドを呼び出した結果が返されますが、暗黙の変換を使用する場合にのみ使用します。彼らが実際に別のことをやり始めると、それは後で推論するのがずっと難しくなります。

+0

おかげジョン。私の場合、問題のオブジェクトはキーとして使用されます。システム内のすべてのキーはタイプのクラスのキーのためのマーカーとして使用されているいくつかのより特定のキーインタフェースを 'IKey'を実装します。すべての実装クラスでは、具体的な型の単一のKeyを持ち、IKey(またはその派生)を返すインターフェイスメソッドの実装はすべて同じインスタンスを返します。 –

+0

@SamHolderは:その後、大丈夫ですね。基本的にこれは.NETの共変戻り値の型の不足を補うれる:( –

関連する問題