3

クラスでの getter/setter メソッドの使用法を理解しようとしています。A という名前のクラスがあり、いくつかのパブリックインスタンス変数があり、その後に引数が別のクラス (メイン) から渡されたパラメーターを持つコンストラクターが続くとします。コンストラクター内では、これらのインスタンス変数が渡されたものと等しくなるようにします。

このクラスが別のプログラマーによって使用される場合、インスタンス変数に直接アクセスしたり、無効なものに変更したりすることを止めるものは何もありません。インスタンス変数を非公開にすることで、それらの変数へのアクセスを排除できます。ただし、これらのインスタンス変数を間接的または特定の条件下で更新/変更したい場合、または単にインスタンス変数にアクセスできるようにする場合は、この目的のために getter/setter ペアを作成します。

利点:
1. set() メソッドの下で特定の正当な理由がある場合にのみインスタンス変数
を変更します。

これは正しい解釈ですか?

4

4 に答える 4

7

カプセル化– 関連するすべてのメンバー (変数とメソッド) をオブジェクトにまとめることを指します。メンバー変数をプライベートとして指定すると、変数とメソッドを非表示にすることができます。オブジェクトは、内部の仕組みを外部から隠す必要があります。適切なカプセル化は、オブジェクトが予期しない方法で相互に作用するのを防ぎ、コードのモジュール性を向上させます。これにより、将来の開発とリファクタリングの作業が容易になります。

ここに画像の説明を入力

クラスのメンバーをカプセル化できることは、セキュリティ整合性にとって重要です。受け入れられない値から変数を保護できます。上記のサンプル コードは、カプセル化を使用してMyMarksオブジェクトを負の値から保護する方法を示しています。メンバー変数vmarksへの変更は、setter メソッドを介してのみ実行できますsetMarks(int mark)。これにより、例外がスローされ、オブジェクトMyMarksが負の値を持つことがなくなります。

于 2012-10-21T09:45:29.407 に答える
1

あなたの解釈は正しいです。また(私の頭の上から):

  • これにより、クラスの実装を変更することができます (たとえば、フィールドを削除して置き換える場合)。コンシューマーにクラスとのやり取りを強制する必要はありません。
  • AOP フレームワークが get / set メソッドへの呼び出しをインターセプトできるようにします。
  • メソッドにアクセスするためのアノテーションを介してパーミッションを指定できます。
于 2012-10-21T09:41:28.663 に答える
0

はい、あなたの解釈は正しいです。でもそれは言葉の限界だからです。たとえば、Python では、メンバー変数の動作をオーバーライドできるため、毎回 getter または setter を記述する必要はありません。例えば:

class MyClass:
    def __init__(self, myproperty):
        self.myproperty = myproperty

そして、誰もが次のような方法でそれを使用する場合:

print(new MyClass("test").myproperty)

ゲッターの動作を変更することもできます:

class MyClass:
    def __init__(self, myproperty):
        self._myproperty = myproperty

    @property
    def myproperty(self):
        return self._myproperty + " changed behavior"

またはタッチコードなしのセッターでさえ、あなたのクラスを使用します:

   @myproperty.setter
   def myproperty(self, myproperty):
       if len(myporperty) > 0:
            self._myproperty = myproperty

より良い例については、プロパティリファレンスを参照してください。

于 2012-10-21T09:59:47.790 に答える
0

インスタンス変数がそのクラスで で定義されたメソッドによってのみ使用される場合は、それをプライベートにする必要があります。セッターと同様に] メソッド。

于 2019-02-13T18:03:19.530 に答える