最近のインタビューで、私は「Javaで抽象とは何か」という非常に一般的な質問をされました。私は定義を与え、抽象メソッドと抽象メソッドと具象メソッドの違いなどとして抽象に関する他の質問が続きました。最後にインタビュアーは、クラスを抽象として使用または定義する必要がある場合にリアルタイムの例を提供するように求めました。混乱しました。いくつかの例を挙げましたが、彼は確信していませんでした。
私はそれをグーグルで検索しましたが、実際の解決策は見つかりませんでした。
だから誰かがリアルタイムの例、つまり彼/彼女のプロジェクトでクラスを抽象として定義したときに私に教えてもらえますか?
ありがとう。
here :-から見つかったリアルタイムの良い例
抽象クラスの具体例は、Animalと呼ばれるクラスです。実生活では多くの動物が見られますが、動物の種類はわずかです。つまり、あなたは決して紫色で毛皮のようなものを見て、「それは動物であり、それを定義する特定の方法はない」と言うことはありません。代わりに、犬、猫、豚、すべての動物が見えます。重要なのは、他の動物(アヒル、ブタなど)以外の動物が歩き回るのを決して見ることができないということです。 Animalは抽象クラスであり、Duck/Pig/Catはすべて、その基本クラスから派生したクラスです。動物は、「Age」と呼ばれる機能を提供し、動物に1年間の寿命を追加します。また、「IsDead」と呼ばれる抽象メソッドを提供する場合があります。このメソッドを呼び出すと、動物が死亡したかどうかがわかります。 IsDeadは抽象的であるため、各動物はそれを実装する必要があります。したがって、猫は14歳に達した後に死んでいると判断するかもしれませんが、アヒルは5歳後に死ぬと判断するかもしれません。抽象クラスAnimalは、それから派生するすべてのクラスにAge関数を提供しますが、これらの各クラスはそれぞれ独自にIsDeadを実装する必要があります。
ビジネス 例 :
任意のデータソース(XML、ASCII(区切りおよび固定長)、さまざまなJDBCソース(Oracle、SQL、ODBCなど))に対して機能する永続性エンジンがあります。 、この永続化で共通の機能を提供する抽象クラスですが、オブジェクトを永続化するときに適切な「ポート」(サブクラス)をインスタンス化します(これにより、ほとんどの作業がスーパークラスで行われるため、新しい「ポート」さまざまなJDBCのもの;永続化だけでなく[テーブル生成]などの他のことも行うため、データベースごとにさまざまな違いを提供する必要があります。)インターフェースの最良のビジネス例はコレクションです。Java.utilで作業できますListの実装方法を気にせずに、Listを抽象クラスとして持つことは、LinkedListとは対照的にanArrayListの動作に基本的な違いがあるため、意味がありません。同様に、MapとSet。オブジェクトのリストであり、それがリスト、マップ、または設定、コレクションインターフェイスを使用できます。
ここでは、抽象クラスについての何か...
リアルタイムの例-
色、サイズ、エンジンなど、他のすべての車のプロパティが含まれる新しい車(WagonX)を作成し、モデル、baseEngineなどの別の機能を車に追加する場合は、単に抽象を作成します定義済みのすべての機能を抽象として使用し、別の機能は具体的であり、ユーザーが定義するWagonXクラス。
抽象クラスWagonXを拡張する別のサブクラスは、デフォルトでは、抽象クラスでインスタンス化される抽象メソッドにもアクセスします。サブクラスは、サブクラスのオブジェクトを作成することにより、具象メソッドにもアクセスします。
コードを再利用するために、開発者は主に抽象クラスを使用します。
abstract class WagonX
{
public abstract void model();
public abstract void color();
public static void baseEngine()
{
// your logic here
}
public static void size()
{
// logic here
}
}
class Car extends WagonX
{
public void model()
{
// logic here
}
public void color()
{
// logic here
}
}
抽象クラスの最良の例はGenericServlet
です。 GenericServlet
はHttpServlet
の親クラスです。これは抽象クラスです。
カスタムサーブレットクラスで「GenericServlet」を継承する場合、service()
メソッドをオーバーライドする必要があります。
JDK自体から少なくとも1つを引用できるはずです。 Java.util.collections
パッケージ。いくつかの抽象クラスがあります。 Map
のインターフェイス、抽象、および具体的な内容と、Joshua Blochがそのように書いた理由を完全に理解する必要があります。
テンプレートメソッドパターン と組み合わせて、抽象クラスをよく使用します。
メイン抽象クラスでは、メインアルゴリズムのスケルトンを記述し、抽象メソッドをフックとして作成し、suclassesが特定の実装を作成できるようにします。 1つの異なる場所(ファイル、データベース、またはその他のソース)からデータを読み取る必要があるデータパーサー(またはプロセッサ)を作成するときによく使用します。
このパターンは 戦略パターン のように見えますが、粒度が低くなり、メインコードが大きくなりすぎたり、メインフローからの例外が必要になった場合、扱いにくいコードに劣化する可能性があります私の経験から)。
ほんの小さな例:
abstract class MainProcess {
public static class Metrics {
int skipped;
int processed;
int stored;
int error;
}
private Metrics metrics;
protected abstract Iterator<Item> readObjectsFromSource();
protected abstract boolean storeItem(Item item);
protected Item processItem(Item item) {
/* do something on item and return it to store, or null to skip */
return item;
}
public Metrics getMetrics() {
return metrics;
}
/* Main method */
final public void process() {
this.metrics = new Metrics();
Iterator<Item> items = readObjectsFromSource();
for(Item item : items) {
metrics.processed++;
item = processItem(item);
if(null != item) {
if(storeItem(item))
metrics.stored++;
else
metrics.error++;
}
else {
metrics.skipped++;
}
}
}
}
class ProcessFromDatabase extends MainProcess {
ProcessFromDatabase(String query) {
this.query = query;
}
protected Iterator<Item> readObjectsFromSource() {
return sessionFactory.getCurrentSession().query(query).list();
}
protected boolean storeItem(Item item) {
return sessionFactory.getCurrentSession().saveOrUpdate(item);
}
}
ここ 別の例。