0

サブクラスを返すための静的ファクトリメソッドを持つ抽象クラスがあります。

public abstract class ITop {
    public static ITop MakeMeOne(whatever x) {
        if(x == something) {
            return BottomA(x);
        }
        else {
            return BottomB(x);
        }
    }
}

public class BottomA : ITop {
    public BottomA(whatever x) {}
}

public class BottomB : ITop {
    public BottomB(whatever x) {}
}

世界の他の部分 (同じアセンブリ内の無関係なクラスを含む)の実装BottomAを非表示にしたいと思います。BottomBそのため、 からのみアクセスできますITop。これは簡単に思えますが、それを行うための正しいアクセサーの組み合わせを見つけることができませんでした。

編集:

すべてを内部化できるとさまざまな人が指摘していますが、同じアセンブリ内のクラスから隠すことが重要な要件であるため、それでは解決しません。

4

3 に答える 3

4

プライベートな内部クラスが解決するもののように聞こえます。

public abstract class ITop {
    public static ITop MakeMeOne(whatever x) {
        if(x == something) {
            return BottomA(x);
        }
        else {
            return BottomB(x);
        }
    }

    private class BottomA : ITop {
        public BottomA(whatever x) {}
    }

    private class BottomB : ITop {
        public BottomB(whatever x) {}
    }
}
于 2013-06-25T21:49:16.070 に答える
2

私はインターフェイスを定義し、ITop他のクラスの「下部」を内部にします。それらを同じアセンブリ内の他の型から「見えないよう」にする場合は、それらを 内でネストされたプライベート クラスとして定義しますITop

public interface ITop
{
}

public abstract class Top : ITop {
    public static ITop MakeMeOne(whatever x) {
        if(x == something) {
            return BottomA(x);
        }
        else {
            return BottomB(x);
        }
    }

    private class BottomA : Top {
        public BottomA(whatever x) {}
    }

    private class BottomB : Top {
        public BottomB(whatever x) {}
    }
}
于 2013-06-25T21:46:47.587 に答える
0
  1. コンストラクターを内部にすることができるため、ファクトリ クラスのみが呼び出すことができます。
  2. クラス全体をファクトリ クラスに対してプライベートにすることができます。後者の例を次に示します: http://code.msdn.microsoft.com/Samples-for-Parallel-b4b76364/sourcecode?fileId=44488&pathId=1696822056

何を選択するかは、何を vfisibel にしたいのか、何を隠したいのかによって異なります。

于 2013-06-25T21:47:01.777 に答える