2

C# や VB.NET などの OOP 言語では、スーパー クラスでプロパティやメソッドを作成するprotectedと、フォームではアクセスできません。それらは、そのスーパー クラスを継承するクラスでのみアクセスできます。

これらのプロパティまたはメソッドにアクセスするにはpublic、カプセル化を無効にするか、継承を無効にするクラスに再書き込みする必要があります。

これを行う正しい方法は何ですか?

4

4 に答える 4

2

クラスに特定の操作を実行するように要求する必要があるコードがあるが、クラスがそれを実行する手段をコードに提示しない場合、クラスはコードの要件を満たしていません。

ハンドルが保護されているため、アクセスできない車(自動車)を持っていると言っているようなものです。車は私には役に立たない。

これらのメンバーをパブリック (または少なくとも内部) にして使用するか、クラスを捨てて、消費するコードに必要な機能を提供するものを使用します。

おそらく、あなたが本当に探しているのはインターフェイスです。インターフェースには、コードが必要とするメンバーが含まれており、そのインターフェースをクラスに実装します。ここでの利点は、継承サブクラスではなく、このインターフェイスを介してメンバーにアクセスしていることをクラスが判断できることです。

于 2008-11-14T11:45:14.487 に答える
1

「カプセル化を打ち負かすそれらを公開する必要があります」

良いデザインと厄介な可視性ルールを混同しないでください。可視性ルールはわかりにくいです。実際には、サブクラスとクライアントという 2 つの直交する可視性があります。サブクラスから何かを隠す理由は完全には明らかではありません。しかし、できprivateます。

ここが重要です。カプセル化とは、隠すことではありません。Protected と Private は、優れたカプセル化の本質的な部分ではありません。すべてを public にすることで、優れた設計を行うことができます (たとえば、Python の動作はそのようになっています)。

保護された/私的なものは、ほとんどが知的財産管理に関するものです。インターフェース?ソフトウェア開発に弁護士が関与している場合は、自分が関与していないものに保護と非公開を追加することに関心があります。

弁護士に相談する必要がない場合は、カプセル化を適切に行い、すべてを公開することを検討してください。

于 2008-11-14T12:00:37.903 に答える
0

特定のクラス インスタンスの特定のインスタンス メソッドを使用できるユーザーを制限するには、少なくとも 3 つの方法があります。

  1. メソッドを「保護」、「内部」、または「プライベート」として定義します。最初のケースでは、インスタンス メソッドは、同じインスタンスの派生クラス メソッド内からのみ使用できます。2 番目のケースでは、アセンブリ内のすべてのクラスがこれらのメソッドにアクセスできますが、外部のクラスはアクセスできません。3 番目のケースでは、コードが宣言クラス内にネストされていない限り、外部クラスは、同じアセンブリ内の派生クラスであってもアクセスできません。
  2. メソッドを「パブリック」として定義しますが、インスタンスを作成するクラスはそれらをプライベートに保ち、決して外部に公開しないようにします。オブジェクトでインスタンス メソッドを呼び出したい人は、それを呼び出すためのインスタンスを持っている必要があります。クラスがインスタンスを保持しているが、それらへの直接参照を公開していない場合、それらのインスタンスで使用できる唯一のインスタンス メソッドは、保持しているクラス自体が使用するものになります。
  3. メソッドを「パブリック」として定義しますが、プライベート メソッドへの 1 つ以上のデリゲートを格納できる場所を受け入れるコンストラクターを用意します。これらのデリゲートにアクセスできるコードは、それによって参照されるメソッドを呼び出すことができますが、他のコードはできません (完全信頼のシナリオでのみ使用できると思われる方法でリフレクションを使用する場合を除く)。

非完全信頼シナリオのリフレクションで、バインドされていないデリゲートを任意のオブジェクト インスタンスにバインドできる場合は、ネストされたクラスを使用して #3 を強化し、フィールドにアクセスして関数privateへの不正なアクセスを取得する必要があります。private完全信頼のシナリオ以外では絶対に禁止されます。

于 2012-04-24T16:20:43.640 に答える
0

申し訳ありませんが、「フォーム内」の意味が明確ではありません。フォームと 2 つのクラスの関係は何ですか? クラスが同じプロジェクト内のコントロールであり、フォームからプロパティにアクセスする場合は、'internal' キーワードを使用する必要があります。

于 2008-11-14T11:46:52.393 に答える