7

抽象クラスから継承する 2 つのパブリック クラスを含むクラス ライブラリがあります。抽象クラスには、継承されたクラスのみがアクセスできる保護されたフィールドがあります。フィールドに使用される型は、内部クラスの型です。

たとえば、私は持っています:

internal class MyInternalClass
{
    ...
}

public abstract class MyAbstractClass
{
    protected MyInternalClass myField;
}

MyAbstract クラスから派生したクラスの 1 つがアセンブリの外部に拡張されている場合、myField へのアクセスが違法になるため、これが機能しないことがわかりました。

私の質問は、MyInternalClass を内部に保持し (アセンブリの外部からアクセスできないようにする必要があります)、アセンブリ内のクラスが myField にアクセスできるように MyAbstractClass を拡張できるようにするにはどうすればよいですか?

4

4 に答える 4

5

MyAbstractClassを必要とし、MyInternalClass実装するパブリック インターフェイスを作成します。

このようなものなのでMyInternalClass、デフォルトでそれを使用できますが、必要に応じて新しい動作を挿入できます (たとえば、モック):

internal class MyInternalClass : IMyInterface
{
}

public interface IMyInterface
{            
}

public abstract class MyAbstractClass
{
    protected IMyInterface myField;

    protected MyAbstractClass(IMyInterface required = null)
    {
        myField = required ?? new MyInternalClass();
    }
}
于 2012-09-19T20:31:12.680 に答える
0

protected "or" internalの代わりにprotected "and" internalを指定するキーワードが必要です。そのようなキーワードは存在しません (C# 5.0 以降)。それ以降のバージョンで追加できます。

ここには非常に多くのスレッドがあります。たとえば、質問 5596338を参照してください。

追加:今、私はこの「解決策」を思いつきました:

public abstract class MyAbstractClass
{
    protected class AccessMyFieldHelper
    {
        internal MyInternalClass this[MyAbstractClass mac]
        {
            get { return mac.myField; }
            set { mac.myField = value; }
        }
    }
    protected static readonly AccessMyFieldHelper AccessMyField = new AccessMyFieldHelper();

    private MyInternalClass myField;
}

myField現在privateですが、 を介したアクセスは保護されていますAccessMyField。これはインデクサーであるため、角かっこを使用する必要があります[]

どう思いますか?これをもっと美しくすることはできますか?

于 2012-09-19T20:40:22.920 に答える
0

できません。がMyAbstractClass外部クラスから派生したMyInternalClassかどうかを知る必要があります。

このようなことを考える必要がある場合は、設計を手直しする必要があるかもしれません。

于 2012-09-19T20:31:22.063 に答える
-1

フィールドをmyField internal protectedにします。

MyAbstractClassを内部にする必要もあります。内部クラスから継承する場合、公開する方法はありません。クラスをパブリックにする必要がある場合は、それを回避する方法が必要です。たとえば、継承クラスが必要とするMyInternalClassの機能を公開するインターフェイスを作成します。

于 2012-09-19T20:33:50.097 に答える