-2

クラスがあります

public class Foo{
    public Foo{...}

    private void someFunction(){...}
    ...
    private Acessor{
        new Acessor
    }
}

いくつかのプライベート機能(someFunction)を使用します。ただし、別のクラスがFoo.SomeFunctionを呼び出せるようにしたい場合があるので、内部クラスにFooにアクセスして、それを渡します。

public class Foo{
    public Foo{...}

    private void someFunction(){...}
    ...
    public Acessor{
        Foo _myFoo;
        new Acessor(Foo foo){_myFoo = foo;}
        public void someFunction(){
            _myFoo.someFunction();
        }
    }
}

このコードを使用すると、FooにsomeFunctionを呼び出す権限を他の人に与えたい場合、Fooは新しいFoo.Accessor(this)を渡すことができます。

残念ながら、このコードを使用すると、誰でもFooで開始されるFoo.Accessorを作成でき、someFunctionにアクセスできます。私たちはそれを望んでいません。ただし、Foo.Accessorをプライベートにすると、Fooから渡すことはできません。

今の私の解決策は、Acessorをプライベートクラスにして、パブリックインターフェイスIFooAccessorを実装させることです。次に、Foo.AccessorをIFooAccessorとして渡します。これは機能しますが、Foo.AccessorがIFooAccessorで余分な時間を使用するすべてのメソッドを宣言する必要があることを意味します。したがって、このメソッドのシグネチャをリファクタリングする場合(たとえば、someFunctionにパラメーターを取得させるなど)、3か所で変更を導入する必要があります。私はこれを数回しなければならなかった、そしてそれは本当に私を悩ませ始めている。もっと良い方法はありますか?

4

3 に答える 3

2

同じアセンブリ内のクラスでsomeFunctionにアクセスできる必要がある場合は、プライベート修飾子ではなく内部修飾子を使用してください。

http://msdn.microsoft.com/en-us/library/7c5ka91b(v=vs.71).aspx

同じアセンブルにないクラスがアクセス可能である必要がある場合は、パブリックである必要があります。ただし、他のアセンブリのいくつかのクラスで使用される場合は、コードをどのように編成するかをよく考える必要があります。

于 2012-12-09T19:03:35.350 に答える
1

何を達成したいのかが(少なくとも私には)明確ではないため、この質問に答えるのは困難です。make it difficult for someone to inadverdantly use this code(コメントを記入します)。

たぶん、メソッドが特別なコンテキストでのみ使用される場合は、インターフェイスを明示的に実装することが必要な場合があります。

public interface ISomeContract {
    void someFunction();
}

public class Foo : ISomeContract {
    public Foo() {...}

    void ISomeContract.someFunction() {...}
}

これは、そのクラスのクライアントがISomeContract呼び出すためにそれをキャストする必要があることを意味しますsomeFunction()

var foo = new Foo();
var x = foo as ISomeContract;
x.someFunction();
于 2012-12-09T19:30:34.570 に答える
1

私も同様の問題を抱えていました。食物連鎖のさらに下流で呼び出されることは想定されていなかった、1つのレイヤーで呼び出される必要のある醜いメソッドを除いて、シンプルでエレガントで理解しやすいクラス。特にこのクラスの消費者によるものではありません。

私がやったことは、私のクラスの通常の呼び出し元が使用しない別の名前空間の基本クラスに拡張機能を作成することでした。私のメソッドにはプライベートアクセスが必要だったので、これはM4Nによって示される明示的なインターフェイスの実装と組み合わされました。

namespace MyProject.Whatever
{
    internal interface IHidden
    {
        void Manipulate();
    }

    internal class MyClass : IHidden
    {
        private string privateMember = "World!";

        public void SayHello()
        {
            Console.WriteLine("Hello " + privateMember);
        }

        void IHidden.Manipulate()
        {
            privateMember = "Universe!";
        }
    }
}

namespace MyProject.Whatever.Manipulatable
{
    static class MyClassExtension
    {
        public static void Manipulate(this MyClass instance)
        {
            ((IHidden)instance).Manipulate();
        }    
    }
}
于 2012-12-10T09:01:11.620 に答える