6

私の質問は公開後すぐに締め切られることになると思いますが、Java での例に関して明確な違いを求めてサイトを検索していたことをお伝えします。急いで質問を閉じないでください。

私は次のように書いています:

public class Bank {
public String name="XXX Bank";
private int noOfCust;

public int getNoOfCust() {
 return getNoOfCusts() + 2;
}
public void setNoOfCust(int noOfCust) {
if(noOfCust > 0)
{
this.noOfCust = noOfCust;
}
}

private int getNoOfCusts()
{
noOfCust = 100;
return noOfCust;
}
}

ここで、「noOfCust は非表示のデータです」。private getNoOfCusts() を導入して実装部分を公開しているのではありません。クラスのすべての詳細をバンドルし、データも隠しているため、これはカプセル化だと思います。

質問 1:この強力なカプセル化の場合は? そうでない場合、どうすれば強くカプセル化されるように改善できますか?

質問 2:抽象化とは、実装を完全に隠すことを意味します。では、私が上で行ったことは抽象化ですか?

上記の説明をインタビュアーに行ったところ、これは正しい意味ではないと言われたため、欲求不満からこの質問を投稿しました。

PS:上記の例で答えてください。リアルタイムの例や仮定は必要ありません。

4

5 に答える 5

12

必要なプロパティを選択し、不要な詳細を非表示にするのはAbstraction. たとえば、人を考えてみましょう。Person には eyes、eyeColor、skinColor プロパティがあります。しかし、彼が Bank に行くと、Bank は抽象化を行い、これらの Person のプロパティを考慮せずに、name、address、phone_number を選択します。これが抽象化です。あなたはそれを誤解しました。

カプセル化とは、オブジェクトの状態 (プロパティ) と動作 (メソッド) を一緒にバインドすることを意味します。クラスを作成している場合は、カプセル化を行っています。

ウィキから: C++、Object Pascal、Java などのオブジェクト指向プログラミング言語では、抽象化の概念自体が宣言的なステートメントになりました。仮想 (C++ の場合) または抽象 (Java の場合) というキーワードを使用します。このような宣言の後、クラスを実装して宣言のオブジェクトをインスタンス化するのはプログラマの責任です。

于 2012-08-29T06:43:29.523 に答える
3
  • 背後にencapsulationある基本的な考え方は、from ビューの内部表現をobjectクラスの定義の外に隠すことです。これは通常、クラスの内部を保護し、それらにアクセスするための体系的な方法を提供するために行われます。

  • また、コンボの背後にある考え方getter/setterは、そのクラスのプロパティにアクセスする制御された方法を提供することです。したがって、privateクラスの各プロパティには、public setter()andgetter()メソッドがあります。

これら 2 つを考慮すると、カプセル化に関してコードに問題がある理由がよくわかります。この概念が実装されたスケルトン クラスは次のようになります。

public class Bank{
    private int noOfCustomers;
    private String name;


    public String getName(){
        return this.name;
    }

    public void setName(String name){
        this.name = name;
    }

    public int getNoOfCustomers(){
        return this.noOfCustomers;
    }

    public void setNoOfCustomers(int noOfCustomers){
        this.noOfCustomers = noOfCustomers;
    }

    /**
    * This method is to illustrate that it is perfectly valid to have
    * multiple types of setter methods
    */
    public void setNoOfCustomers(String noOfCustomers){
        try{
            this.noOfCustomers = Integer.parseInt(noOfCustomers);
        }catch(Exception exe){
            //Handle exceptions
        }
    }
}

についてabstraction: 単純化された方法で何かを提示するためのアイデアと考えることができます。これは、使用法に関して簡単に理解できるか、状況により適しています。あなたの例を挙げると、は連邦銀行または州加盟銀行の両方を表すことができますBankabstraction基本的に、銀行を親として、これらの表現のそれぞれに対して特定のクラスを派生させます。

Javaで何を表現するabstractionかを勉強すれば、よりよく理解できると思います。Fileファイル自体は、ファイルとディレクトリのパス名の抽象表現です。ただし、ソース コードを調べると、privateその設計に適したいくつかのプロパティが含まれていることがわかります。

カプセル化自体は、プロパティを誤用や抽象化からどれだけ保護しているかと考えることができ、外部ユーザーにどれだけの簡素化を提供しているかと考えることができます。

于 2012-08-29T06:47:09.830 に答える
2

カプセル化: わかりました。非常に奇妙な実装があり、呼び出し元はそれを見ることができません。

抽象化: 実際に何をしようとしているのかを知る必要があります。現在のインターフェイスは、整数値のゲッター/セッターのように見えます。これはあまり抽象的ではありません (実装はそのようには機能せず、別のことを行います)。抽象化の場合、実行される操作 (または関連するオブジェクト) は、具体的な実装から切り離されているだけでなく、より広い範囲のものに適用できるものをキャプチャする必要があります (それらは異なりますが、それらを作成できるという点で類似しています)。同じ「抽象化」に属します)。あなたの例は、おそらくこれには小さすぎます。

この例に基づいて構築を試みるには、企業を規模別に分類するコードがあるとします。顧客数、従業員数などのプロパティを使用した「ビジネス」の抽象化があります。この抽象化を使用するコードは、銀行、薬局、食料品店でも同様に機能します。

于 2012-08-29T06:50:24.193 に答える
0

カプセル化と抽象化を誤解しているのではないかと思います。

カプセル化は、ブラックボックスの観点からより明確に説明されています。内部は必要に応じて変更できますが、パブリックインターフェイスは同じままです。そうは言っても、パブリックゲッターとセッター(およびプライベートゲッター、私には目的がありませんが、それはあなた次第です)を持つプライベートintがあるため、コードは部分的にカプセル化されます。ただし、String name公開されており、ゲッターやセッターはありません。定数にするつもりのようです。その場合は、public、static、finalとして宣言する必要があります。

抽象化とは、1つのアイデアをより一般的なオーバーヘッドのアイデアに単純化するという概念です。Javaでは、一般的なアイデアを提供するが詳細が欠けている実装を提供することでクラスを抽象化でき、インスタンス化することはできません。これはabstract、クラスを変更するときに抽象クラスをインスタンス化できないことを示す修飾子によって実現されます。メソッド(抽象クラ​​スに含まれている必要があります)を変更する場合、修飾子は、抽象メソッドが任意のサブクラス実装で定義されている必要があることを示します。

Javaでの抽象化の例。抽象化により、野球はボールであることが示されます。

public abstract class Ball {
    // this class cannot be instantiated
    public abstract double getRadius();

    public double getVolume() {
        return (4.0 / 3) * Math.PI * Math.pow(getRadius(), 3);
    }
}

public class Baseball extends Ball {
    // this class can be instantiated
    @Override
    public double getRadius() {
        return 3.0;
    }
}
于 2012-08-29T06:42:06.477 に答える
-1

Java でのカプセル化は、オブジェクトとメソッドを通じて自動的に行われます。気にする必要はありません。ただし、必要に応じて、さまざまな隠蔽手段を使用して複雑さを増すことができます。したがって、他の人はあなたのコードを解読できなくなります。再帰関数や複雑なメソッドを使用したり、不要なコードを追加したりする場合があります。強力カプセル化!!

于 2012-08-29T06:43:42.637 に答える