2

Javaの抽象化について少し混乱しています。

抽象化はデータの隠蔽(実装の隠蔽)であると述べている多くのページを確認しました。

抽象化について私が理解しているのは、それが「部分的な実装」であるということです。抽象クラス/インターフェースで必要なものを定義し、その後それらを拡張/実装して、独自の機能を追加するだけです。

私が理解していないのは、これがどのようにデータを隠蔽しているのかということです? クラス/インターフェイスを実装すると、コードにアクセスできるようになり、必要に応じて変更します。

これに関する多くの質問や記事を確認しましたが、まだ混乱しています。

どんな助けでも大歓迎です。ありがとう。

4

9 に答える 9

1

クラス/インターフェイスを実装すると、コードにアクセスできるようになり、必要に応じて変更します。

ここで、言語が提供する概念について少し混乱していると思いますAbstraction。自分のコードにはいつでもアクセスできますが、AbstractionORのようなPolymorphismものは、あるべき理想的な方法を提供します。したがって、抽象メソッドとしてAbstraction名前を持つ動作があることはわかっていると言っているだけですが、someThing今のところ、それがどのように動作するかはわかりません。実装者は、これがどのようになるかを教えてくれます。次のコードを参照してください。

abstract class Game{
 public abstract void play();
}

class Football extends Game{
  @Override
  public abstract void play(){
      // write how football play
  }
}

class Cricket extends Game{
  @Override
  public abstract void play(){
      // write how Cricket play
  }
}

私はあなたに質問を残してここにいます。

Why you are making class level attributes public/protected/private although you have access to the code when you implement?

于 2016-05-10T07:16:13.047 に答える
1

ArrayListデータの隠蔽とは、ドキュメントを読まないと内部で API を操作する方法 (たとえば、) を理解できない場合です。API 作成者は、そこにある配列へのアクセスを提供しません。

API の実装を使用するユーザーから隠します。内部でどのように機能するかについて心配する必要はありません。提供されている機能だけに関心があります。

それについての良い記事があります。

于 2016-05-10T06:53:55.727 に答える
1

これがあなたの質問に答えるかどうかはわかりませんが、一般的に抽象クラスについて話している場合、子クラスがすべての詳細を知ったり処理したりすることなく、それを拡張する機能を子クラスに提供するためにそこにあります。実装 (子クラスのユーザーからは隠されています)。

たとえば、車を見てみましょう。

public abstract class Vehicle {
    protected int _numberOfWheels;
    public Vehicle() {
        this._numberOfWheels = 4;
    }
}

public class Truck extends Vehicle {
    public int carryingLoad;
    public Truck() {
        this.carryingLoad = 4000; // kg or something
    }
}

したがって、 vehicle は vehicle オブジェクトの抽象的なインスタンスであり、車輪の数など、関連付けられたいくつかの機能がすでにあります。これは保護されたメソッドなので、トラックの新しいインスタンスを作成すると:

// Inside main
Truck truck = new Truck();

ただし、クラス内でトラックの関数を次のように記述した場合、車輪の数を変更することはできません。

// Inside the Truck class
public void addSpareTire() {
    this._numberOfWheels++;
}

私はそれを次のように呼び出すことができます:

// Inside main
truck.addSpareTire();

いくつかの変数と対話することはできましたが、抽象クラスを拡張するクラス内の関数を徹底的に処理することしかできませんでした。を呼び出すことで一度に 1 つのタイヤを追加できますが、オブジェクトを使用しているメイン関数からaddSpareTire()直接対話することはできませんでしたが、クラス宣言内からはできます。トラック オブジェクトのユーザーからは、その情報は隠されています。_numberOfWheelsTruckTruck

これがあなたの求めているものかどうかはわかりません。お役に立てれば。

于 2016-05-10T07:04:04.703 に答える
1

オブジェクト指向プログラミングでは、抽象化は実装の詳細をユーザーから隠すプロセスであり、機能のみがユーザーに提供されます。つまり、ユーザーは、オブジェクトがどのように動作するかではなく、そのオブジェクトが何を行うかについての情報を得ることができます。

詳細については、次のリンクを確認してください: http://www.visionsdeveloper.com/tutorial/java/java-abstraction.jsp

于 2016-05-10T07:04:22.077 に答える
0

データの隠蔽は基本的に、クラスの内部データ メンバーに関する詳細を隠し、関連するクラスに排他的にアクセスできるようにすることです。

したがって、アプリケーション内の他のクラスまたは他のアプリケーションからの不必要な侵入を回避します。つまり、他のクラスはプライベート メンバー変数に直接アクセスできません。

したがって、このようにして、関連するクラスの内部詳細を抽象化します。

于 2016-05-10T07:03:47.777 に答える
0

あなたから情報を隠しているのではなく、あなたの抽象化のクライアントから情報を隠しています。この例を見てください。

public class Demo {
    Client client = new Client(new Implementation());
}

public interface Abtraction {
    void doWork();
}

public class Implementation implements Abtraction{
    @Override
    public void doWork() {
        //doingTheWork
    }
}

public class Client{
    private Abtraction theAbstraction;

    public Client(Abstraction theAbstraction){
        this.theAbstraction = theAbstraction;
    }
}

クラスClientは の実装を認識しませんAbstraction。これは、クラスがを台無しにすることなくDemo、 のさまざまな実装を提供できることを意味します。AbstractionClient

于 2016-05-10T07:02:16.713 に答える