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;}
}
と私のクラス:次のように反変します。このソリューションの適用性は、A
がABase
に何かを追加するかどうかによって異なりますか?
元のメソッドの派生型を返すように、派生型のメソッドを隠すだけの私の元の計画ですか?
私はそれを見ると、複数の継承を持たない制限の1つに陥っているだけです。工場やビルダーのパターンによっては、その日を節約することができます。 – CodingBarfield