2012-07-25 25 views
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; 
    } 
} 

私はしばらく時間をかけてコードを検索しましたが、必要なものを手に入れることができませんでした。誰でも助けてくれますか?

私はクラスCは密接にカプセル化されていないと考えていますが、メソッドはプライベートであるためです。そしてクラスAについては、カプセル化されていないことだけが感じられます。カプセル化の基本的な定義では、「メンバーを非表示にして、必要な方法で動作するメソッドをクラスに提供する必要があります。クラスAにはアクセサ・ミューテータ・メソッドはありません。したがって、Aはカプセル化されていると見なされるべきではない。私は確信していませんが。私が間違っていれば私を修正してください。

+0

これはおそらくプライベートカプセル化されることはありませんではないと定義されて1つのメンバ変数が含まれている場合は、すべてのメンバ変数がプライベートので、すべてのクラスが緊密に封入されている NBとして宣言されていることを意味します助けにはならないでしょうが、質問は(おそらくあなたのインストラクターによって)馬鹿げた抽象的な方法で提起されています。クライアントが必要とするインタフェースのみを公開する場合、クラスは密にカプセル化されます。あるクラスの目的を知らずに意味のあることを言うのはかなり不可能です。 – millimoose

答えて

1

あなたは正確です。タイトなカプセル化は、プライベートフィールドがパブリックゲッターとセッターとペアになっていることを意味するため、クラスAとクラスCの両方が密にカプセル化されていません。

+0

今私は混乱しています... A:クラスA B:クラスB C:クラスC D:上記以外 – user1500024

+2

内部への直接アクセスはカプセル化を意味しますか? – jeff

1

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

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

私は銀行口座の場合、私は合計と呼ばれるプライベートフィールドを持っています。私はユーザーが自分の合計を直接設定することはできません。代わりに、私は払い戻し(ダブルアム)とデポ(ダブルアム)を公開し、必要に応じて合計を管理します。

プライベートメンバーのみがAにハングアップしないでください。これらのクラスの断片を考えてみましょう。ユーザーの機能は表示されていません。

+0

実際にこの質問は、A、B、C、またはなしの4つの選択肢で、募集適性テストで尋ねられます。 それらのうち、正しいものは1つだけです。だから、最も正しい答えは何ですか? – user1500024

+0

@ user1500024これらのオプションのうち、私はNoneと言っています。なぜなら、 'B'はすべての内部を公開し、' A'と 'C'は何も公開しないので役に立たないからです。それは、 '' B'に答えるための議論があると言いました(なぜなら、 'x'を公開している間に少なくともそれへのアクセスを制御しているからです)。 'A'と' C'には 'x'をまったく公開しないので議論があるのと同じように。それはばかげて曖昧な質問です。 – millimoose

+1

私は全く同意する...私はそのような質問を設計した人を救う。 – user1500024

4

「タイトなカプセル化」は、クラス内でどのように定義されていますか?私がGoogleの検索から知る限り、学者や業界全体の定義はありません。

私は、各クラスがよくカプセル化されているか、それぞれがカプセル化されていないと主張できます。なぜプライベート変数Xの名前にクライアントがさらされているのですか?残念です。なぜクラスAは機能を公開していないのですか? Cがそれを使用すべきドメイン内のゲッターだけを公開するのは正しいですか?

この質問は、カプセル化の概念を誤って表しています。 「カプセル化ベリファイア」ルーチンでコードを実行することはできません。それは、露出しているべきであるべきであり、そうでないべきでないことが、あなたが言うと言う人間の意思決定です。基本的には、これは一般にデータをプライベートにする必要がありますが、メソッドを公開するかプライベートにするかは、それが実際に何を意味し、何をしているかによってまったく異なります。

0

カプセル化の定義には、公共のアクセサーの必要性が言及されているだけで意味があるので、それ以外の理由はないと思います。だから私は厳密にカプセル化されたクラスは、メンバーを隠すクラスであり、他のクラスのオブジェクトによってそれらに直接アクセスすることを妨げると言うでしょう。それだけです。私はNoneと一緒に行きたいと思います。そのうち2つが意味をなさない場合でも、これらのクラスはすべてカプセル化されています。

0

クラスBがしっかりあるため定義に従ってカプセル化されます。ここ

0

あなたのすべての上記のクラスが緊密に封入されている「クラスはプライベート変数&のパブリックプロパティで宣言されている場合、しっかりとカプセル化 と言われています」。

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

-1

クラスは、すべての変数がプライベートとして宣言されている場合だけ「しっかりカプセル化」されると言われている。(彼らは方法かゲッターセッターが含まれているにかかわらず場合。

あなたの例ではすべて各クラスは、プライベートとしてすべての変数を持っているので 3クラスが緊密に封入されている。自分で説明

0

すべての3つのクラスが緊密に封入されている。

Iクラスがプライベート変数のみを持ち、他のパブリック変数を持たない場合、クラスは密接にカプセル化されたクラスと言われます。

getterメソッドやsetterメソッドに依存しません。

他のクラスや関数で使用できるように、変数を作成する必要があるため、ゲッタとセッタを必要とします。

したがって、パブリックゲッターとセッターメソッドにかかわらず、3つのクラスはすべて密接にカプセル化されています。

0

緊密にカプセル化されたクラスは親クラスがあなたの子供のクラスがしっかり

関連する問題