8

同じプロジェクト内に異なるインターフェイスを実装する2 つのリポジトリ クラス (RepositoryFactoryおよび) があります。BaseRepositoryこのBaseRepositoryクラスには、同じ実装を持つ他のクラスでも必要になるプライベート メソッドがあります。

メソッドをプライベートに保つために複製する代わりに、可能な代替案を考えていましたが、定義上、プライベートメソッドはそれ自体のクラスでのみスコープを持つため、これまでのところ良い解決策を見つけることができませんでした.

2 つのクラスは意味的にリンクされていないため、継承を使用してメソッドを「保護」に変更することもできません。戻り値の型が void であるため、メソッドの結果を返すパブリック プロパティを使用できません。

4

4 に答える 4

9

C#でやりたいことをすることはできません。最も近いのはinternal、です。これにより、メンバーがアセンブリ全体に表示されます。2つのクラスをプライベートにして別のクラス内にネストすることも可能かもしれませんが、これが常に適切であるとは限りません。

C#に取り組んでいるMads Torgersenは、次のように述べています。

「クラスセットのアクセシビリティ」の概念に取り組もうとしている多くの提案を見てきました。もちろん、複雑なのは、既存のアクセシビリティとは異なり、それを結び付ける自然なグループ(全員、アセンブリ、派生クラス、単一クラス)がまだないため、別のアクセシビリティ修飾子を使用しても、構文(または何か)が必要になることです。グループを定義します。

それをスライスするいくつかの方法があります。明らかに正しい提案は見たことがありませんが、問題は関連していると思いますので、設計チームに相談します。

ソース

于 2012-08-10T10:59:34.703 に答える
4

できますが、見栄えが悪いです。これは、ネストされたクラスが含まれているクラスからプライベートなものにアクセスできることを利用しています。ただし、できるからといって、やればいいというわけではありません。修飾子を に変更するだけinternalで同じ動作が得られ、2 つのクラスが結合されているため、同じアセンブリでそれらを出荷するのが理にかなっているため、内部修飾子が正しい答えです。

public class BaseRepository
{
    public sealed class RepositoryFactory
    {
        public static BaseRepository Create()
        {
            var repo = new BaseRepository();

            repo.MethodRequiredByRepositoryFactory();

            return repo;
        }
    }

    private void MethodRequiredByRepositoryFactory() { }
}
于 2012-08-10T11:03:26.773 に答える