Java のベスト プラクティスを調べると、継承を回避することが良い方法であることがわかります。理由の 1 つは、次の問題に示されている可能性があります。
ここに、「ArrayList」を拡張するサブクラス「Stack」があります。
class Stack extends ArrayList
{ private int stack_pointer = 0;
public void push( Object article )
{ add( stack_pointer++, article );
}
public Object pop()
{ return remove( --stack_pointer );
}
public void push_many( Object[] articles )
{ for( int i = 0; i < articles.length; ++i )
push( articles[i] );
}
}
push()
前のコードで定義されたを使用してスタックに追加しclear()
、基本クラス (つまり ArrayList)を使用してスタックをクリアしたいとしましょう。
Stack a_stack = new Stack();
a_stack.push("1");
a_stack.push("2");
a_stack.clear();
- ここで問題は
コードは正常にコンパイルされますが、基本クラスはスタック ポインターについて何も知らないため、Stack オブジェクトは未定義の状態になります。次に push() を呼び出すと、新しい項目がインデックス 2 (stack_pointer の現在の値) に置かれるため、スタックには実質的に 3 つの要素があり、下の 2 つはガベージです。
だから私の質問は、なぜですか
基本クラスはスタックポインタについて何も知りません
つまり、予約されているスタック ポインターの状態はどこにあるのでしょうか。
出典:拡張が悪い理由