0

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 つはガベージです。

だから私の質問は、なぜですか

基本クラスはスタックポインタについて何も知りません

つまり、予約されているスタック ポインターの状態はどこにあるのでしょうか。

出典:拡張が悪い理由

4

2 に答える 2