5

これは私の宿題の質問です:次のクラスのうち、しっかりとカプセル化されていないものはどれですか?

class A
{
    private int x;
}
class B
{
    private int x;
    public void setX(int x)
    {
        this.x=x;
    }
    public int getX()
    {
        return x;
    }
}
class C
{
    private int x;
    private void setX(int x)
    {
        this.x=x;
    }
    private int getX()
    {
        return x;
    }
}

coderanchを検索するのに少し時間を費やしましたが、必要なものを取得できませんでした。誰か助けてくれませんか?

私が思うに、クラスCは厳密にカプセル化されていません。これは、メソッドがプライベートであるためです。そして、クラスAについて私が感じているのは、それがカプセル化されているだけではないということです。カプセル化の基本的な定義では、「メンバーを非表示にして、希望どおりに動作するユーザーメソッドをクラスに提供する必要があります」と書かれているためです。現在、クラスAにはアクセサーミューテーターメソッドがありません。したがって、Aはカプセル化されていると見なされるべきではありません。よくわかりませんが。私が間違っている場合は訂正してください。

4

14 に答える 14

4

クラスで「厳密なカプセル化」はどのように定義されていますか?私がグーグル検索から知る限り、これの学界または業界全体の定義はありません。

各クラスは十分にカプセル化されているか、各クラスのカプセル化が不十分であると言えます。クライアントがプライベート変数Xの名前に公開されるのはなぜですか?残念なようです。クラスAが機能を公開しないのはなぜですか?Cが、それが使用されるべきドメインでゲッターのみを公開することは「正しい」のでしょうか?

この質問は、カプセル化の概念を誤って伝えています。「カプセル化ベリファイア」ルーチンを介してコードを実行することはできません。それは人間の設計上の決定であり、公開されているものはあるべきであり、そうでないものはそうではないということです。基本的に、これには通常、データをプライベートにする必要がありますが、メソッドをパブリックにするかプライベートにするかは、実際の意味と実行内容に完全に依存します。

于 2012-07-25T15:40:39.830 に答える
2

その通りです。クラス A とクラス C はどちらも、厳密にカプセル化されていません。これは、厳密にカプセル化すると、プライベート フィールドがパブリック ゲッターおよびセッターとペアになることを意味するためです。

于 2012-07-25T15:33:47.600 に答える
1

カプセル化の定義は正しいです。しかし、私はあなたが少し迷っていると思います。

カプセル化とは、他の人が内部に直接アクセスできないようにすることを意味します。ユーザー機能を公開し、独自の内部を管理します。

したがって、私が銀行口座の場合、total というプライベート フィールドがあります。ユーザーが合計を直接設定できないようにします。代わりに、withdraw(double amt) と deposit(double amt) を公開し、必要に応じて合計を管理します。

プライベート メンバーだけを持つ A にこだわらないでください。これらのクラス フラグメントを考慮してください。ユーザーの機能が表示されていないなどの理由で、もう一度回答してみてください。

于 2012-07-25T15:36:33.283 に答える
1

クラスのすべてのデータ メンバー (変数) がプライベートとして宣言されている場合にのみ、そのクラスはしっかりとカプセル化されていると言われます。

クラスにすべての変数がプライベートとして宣言されており、すべてのプライベート データ メンバーを持つ他のクラスによって継承されている場合、後者のクラスも密にカプセル化されたクラスと言われます。

于 2018-04-02T10:09:13.990 に答える
0

カプセル化の定義では、それが単に理にかなっているという理由だけで、他の理由もなく、パブリックアクセサーの必要性が言及されていると思います。したがって、厳密にカプセル化されたクラスは、そのメンバーを非表示にして、他のクラスのオブジェクトによるメンバーへの直接アクセスを防ぐクラスであると言えます。以上です。Noneこれらのクラスの2つがあまり意味をなさない場合でも、これらのクラスはすべてカプセル化されているので、私は一緒に行きます。

于 2012-07-25T16:23:47.150 に答える
0

上記のクラスはすべて、しっかりとカプセル化されています。

クラスは、すべてのデータ メンバーがプライベートとして宣言されている場合にのみ、密にカプセル化されていると言われます。ここでは、パブリック アクセサーまたはミューテーターが存在するかどうかについて心配する必要はありません。

于 2016-09-11T19:03:44.957 に答える