インターフェイスで保護されたアクセスメンバーを宣言することに反対する議論は何ですか?たとえば、これは無効です。
public interface IOrange
{
public OrangePeel Peel { get; }
protected OrangePips Seeds { get; }
}
この例では、インターフェースは、実装者が少なくとも継承者にインスタンスを提供するIOrange
ことを保証します。実装者が望む場合は、スコープを完全に拡張できます。OrangePips
public
public class NavelOrange : IOrange
{
public OrangePeel Peel { get { return new OrangePeel(); } }
protected OrangePips Seeds { get { return null; } }
}
public class ValenciaOrange : IOrange
{
public OrangePeel Peel { get { return new OrangePeel(); } }
public OrangePips Seeds { get { return new OrangePips(6); } }
}
インターフェイスのメンバーの目的は、継承者(サブクラス)にprotected
サポートコントラクトを提供することです。次に例を示します。
public class SpecialNavelOrange : NavelOrange
{
...
// Having a seed value is useful to me.
OrangePips seeds = this.Seeds;
...
}
(確かに、これはsでは機能しませんstruct
)
インターフェイスのprivate
または修飾子のケースの多くはわかりませんが、と修飾子の両方をサポートすることは完全に合理的であるように思われます。internal
public
protected
メンバーをsから完全に分離することにより、sのprotected
メンバーの有用性を説明してみます。interface
interface
継承者のコントラクトを適用するための新しいC#キーワード、を想像してみましょうsupport
。これにより、次のように宣言できます。
public support IOrangeSupport
{
OrangePips Seeds { get; }
}
これにより、クラスを契約して、保護されたメンバーを継承者に提供できます。
public class NavelOrange : IOrange, IOrangeSupport
{
public OrangePeel Peel { get { return new OrangePeel(); } }
protected OrangePips Seeds { get { return null; } }
}
protected
クラスは、そもそもメンバーを提供することによってこの契約をすでに暗示しているため、これは特に有用ではありません。
しかし、これを行うこともできます:
public interface IOrange : IOrangeSupport
{
...
}
IOrangeSupport
これにより、実装するすべてのクラスに適用しIOrange
、特定のメンバーを提供するように要求しprotected
ます。これは、現在私たちができることではありません。