C# や VB.NET などの OOP 言語では、スーパー クラスでプロパティやメソッドを作成するprotected
と、フォームではアクセスできません。それらは、そのスーパー クラスを継承するクラスでのみアクセスできます。
これらのプロパティまたはメソッドにアクセスするにはpublic
、カプセル化を無効にするか、継承を無効にするクラスに再書き込みする必要があります。
これを行う正しい方法は何ですか?
C# や VB.NET などの OOP 言語では、スーパー クラスでプロパティやメソッドを作成するprotected
と、フォームではアクセスできません。それらは、そのスーパー クラスを継承するクラスでのみアクセスできます。
これらのプロパティまたはメソッドにアクセスするにはpublic
、カプセル化を無効にするか、継承を無効にするクラスに再書き込みする必要があります。
これを行う正しい方法は何ですか?
クラスに特定の操作を実行するように要求する必要があるコードがあるが、クラスがそれを実行する手段をコードに提示しない場合、クラスはコードの要件を満たしていません。
ハンドルが保護されているため、アクセスできない車(自動車)を持っていると言っているようなものです。車は私には役に立たない。
これらのメンバーをパブリック (または少なくとも内部) にして使用するか、クラスを捨てて、消費するコードに必要な機能を提供するものを使用します。
おそらく、あなたが本当に探しているのはインターフェイスです。インターフェースには、コードが必要とするメンバーが含まれており、そのインターフェースをクラスに実装します。ここでの利点は、継承サブクラスではなく、このインターフェイスを介してメンバーにアクセスしていることをクラスが判断できることです。
「カプセル化を打ち負かすそれらを公開する必要があります」
良いデザインと厄介な可視性ルールを混同しないでください。可視性ルールはわかりにくいです。実際には、サブクラスとクライアントという 2 つの直交する可視性があります。サブクラスから何かを隠す理由は完全には明らかではありません。しかし、できprivate
ます。
ここが重要です。カプセル化とは、隠すことではありません。Protected と Private は、優れたカプセル化の本質的な部分ではありません。すべてを public にすることで、優れた設計を行うことができます (たとえば、Python の動作はそのようになっています)。
保護された/私的なものは、ほとんどが知的財産管理に関するものです。インターフェース?ソフトウェア開発に弁護士が関与している場合は、自分が関与していないものに保護と非公開を追加することに関心があります。
弁護士に相談する必要がない場合は、カプセル化を適切に行い、すべてを公開することを検討してください。
特定のクラス インスタンスの特定のインスタンス メソッドを使用できるユーザーを制限するには、少なくとも 3 つの方法があります。
非完全信頼シナリオのリフレクションで、バインドされていないデリゲートを任意のオブジェクト インスタンスにバインドできる場合は、ネストされたクラスを使用して #3 を強化し、フィールドにアクセスして関数private
への不正なアクセスを取得する必要があります。private
完全信頼のシナリオ以外では絶対に禁止されます。
申し訳ありませんが、「フォーム内」の意味が明確ではありません。フォームと 2 つのクラスの関係は何ですか? クラスが同じプロジェクト内のコントロールであり、フォームからプロパティにアクセスする場合は、'internal' キーワードを使用する必要があります。