0

この質問についてここで何も見つからなかったなんて信じられないので、次のようにします。

クラスを派生させるときに、スーパークラスのすべてのコンストラクターを明示的に定義する必要があるのはなぜですか。派生クラスがその署名を持つスーパーコンストラクターを提供しない場合、Java がスーパーコンストラクターを自動的に呼び出さないのはなぜですか。

それは"Syntax Sugar"の素晴らしい部分です。

例: Android では、各ビュー サブクラスは、XML またはコードから呼び出される 3 つのコンストラクターを提供します。コードと XML でカスタム ビューを作成できるようにするには、何もしない場合でも、3 つのコンストラクターをすべて定義する必要があります。これは私が昨日書かなければならなかった小さな例です

public class OverfocusableGridView extends GridView {

    public OverfocusableGridView(Context context) {
        super(context);
    }

    public OverfocusableGridView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public OverfocusableGridView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        boolean keyHandled = false;
        if (this.getSelectedView() != null) {
            int focusedViewPosition = this.getSelectedItemPosition();
            switch (keyCode) {
            case KeyEvent.KEYCODE_DPAD_LEFT:
                if (focusedViewPosition > 0) {
                    int prevItemPosition = focusedViewPosition - 1;
                    this.setSelection(prevItemPosition);
                    keyHandled = true;
                }
                break;
            case KeyEvent.KEYCODE_DPAD_RIGHT:
                if (focusedViewPosition < this.getChildCount() - 1) {
                    int nextItemPosition = focusedViewPosition + 1;
                    this.setSelection(nextItemPosition);
                    keyHandled = true;
                }
                break;
            default:
                keyHandled = super.onKeyDown(keyCode, event);
            }
        } else {
            keyHandled = super.onKeyDown(keyCode, event);
        }
        return keyHandled;
    }

}

これらのコンストラクターを定義する必要がなければ、もっといいでしょう。このアプローチには欠点がありますか、それともそれを説明する Java 設計の決定はありますか?

つまり、簡単に言えば、これは何らかの理由で不可能なのですか?

4

2 に答える 2