【问题标题】:Need to define explicit contructor in overridden class [duplicate]需要在重写的类中定义显式构造函数[重复]
【发布时间】:2013-11-17 09:39:59
【问题描述】:

我不敢相信我在这里没有找到任何关于这个问题的东西,所以:

为什么在派生类时需要显式定义超类的所有构造函数。当派生类不提供具有该签名的超级构造函数时,为什么 Java 不会自动调用超级构造函数。

那将是一些不错的“语法糖”

例如:在 Android 中,每个视图子类都提供 3 个构造函数,它们可以从 XML 或代码调用。为了能够在代码和 XML 中创建自定义视图,我需要定义所有三个构造函数,即使它们不做任何事情。这是一个小例子我had to write yesterday

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 设计决策可以解释这一点?

所以,长话短说:这不可能是有原因的吗?

【问题讨论】:

  • 是的,谢谢,我没有找到它,因为我搜索了派生....忘记了继承这个词:)

标签: java


【解决方案1】:

假设构造函数继承...那么因为每个类最终都派生自 Object,每个类最终都会有一个无参数的构造函数。这是个坏主意。你究竟会期待什么:

FileInputStream stream = new FileInputStream();

要做什么?

现在可能应该有一种方法可以轻松创建相当常见的“传递”构造函数,但我认为它不应该是默认值。构造子类所需的参数通常与超类所需的参数不同。


答案来自: https://stackoverflow.com/a/1644410/1724097

没有“继承”这个词很难找到另一个问题,所以我明白你为什么没有找到答案(:

【讨论】:

  • 为了澄清,我复制了答案,所以如果旧链接被删除,它不会影响这个答案。
【解决方案2】:

Java 子类不必具有与超类相同的构造函数!子类通常有更少和/或更简单的构造函数。

你真的需要所有的构造函数吗?

【讨论】:

  • 我需要它们。我使用仅上下文构造函数在代码中创建视图,并在解析我的 XML 布局时调用 Context&AttributeSet。好的,第三个可以省略,但我的问题不是针对这段特定的代码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-27
  • 2020-04-23
  • 1970-01-01
  • 2020-09-04
  • 2016-07-13
相关资源
最近更新 更多