class A {
.
.
.
}
class B extends A {
.
.
.
}
A var = new B()
動作します。しかし、単純なものではなく、いつこれを行う必要がありB var = B()
ますか? どんな違いがあるの?var.method() または var.field の使用中に何か違いはありますか?
class A {
.
.
.
}
class B extends A {
.
.
.
}
A var = new B()
動作します。しかし、単純なものではなく、いつこれを行う必要がありB var = B()
ますか? どんな違いがあるの?var.method() または var.field の使用中に何か違いはありますか?
適切な最もスーパークラスまたは理想的にはインターフェイスを使用します。これは、必要な最小限の機能をコードで示し、コードを変更する必要があるかどうかを示しています
A var = new B();
に
A var = new C(); // C also extends A
これは些細なことです。ただし、B
どこでも使用すると、後でコードを変更してチェックするために mroe を機能させることになります。
唯一の例外は、オブジェクトを一般化しすぎて、重要な動作を見逃す可能性がある場合です。例えば
void methodIsInSet(Set<T> set);
で置き換えることができます
void methodIsInSet(Collection<T> set);
メソッドは同じですが、重複などに関する重要な仮定を除外しています。
通常、 などの単純なステートメントではそれを行わないA var = new B()
ため、多くの場合、あなたの観察は正しいです。ただし、次のように使用します
public A CreateAnObject(int i)
{
if (i = 0)
return new A();
else
return new B();
}
これで、A var = CreateAnObject(something)
. var は A または B のいずれかになります。
ケース 1. JDBC がその例です。オブジェクトを参照するために Connection、Statemet インターフェースを使用しますが、プロバイダーはあなたのクラスのために ConnectionImpl と StatementImpl を実装します (ここでは、名前については気にしません)。
ケース 2: インターフェイスは一般的な表現であり、実装は特定の表現です。インターフェイスを使用する場合、同じ参照が他の実装クラス オブジェクトに役立つ場合があります。