2009-09-06 121 views
14

我想有与被所有子类自动继承的参数的构造方法,但Java不会让我做这件事的Java:继承构造

class A { 
    public A(int x) { 
    // Shared code here 
    } 
} 

class B extends A { 
    // Implicit (int x) constructor from A 
} 

class C extends A { 
    // Implicit (int x) constructor from A 
} 

我不希望有为每个孩子班级编写B(int x),C(int x)等。有没有更好的方法来解决这个问题?

解决方案#1。制作一个init()方法,可以在构造函数之后调用它。尽管对于我的特定设计,我仍然希望用户在构造函数中指定在编译时验证的某些参数(例如,不通过varargs/reflection)。

回答

26

你不能。如果你想在你的基类中有一个参数化的构造函数 - 而且没有无参数的构造函数 - 你将不得不在每个后代类中定义一个构造函数(并且调用构造函数super())。

+14

真是无可奈何...... – machete 2014-02-15 13:23:45

+1

不管我多次提醒这件事,它仍然令人不安。把所有这些努力都放在做综合基础班上,那么孩子们最终会成为50个班级,因为我必须改写这么多的样板 – 2017-01-04 20:01:56

2

你不能在java中。如果没有在方法中显式声明方法参数,则不能提供方法参数。这样做可能不是最好的想法,它可能会导致代码混乱和过于复杂的事情。不得不输入几个额外字符的替代方法不是,即不好。 :d

4

Inheritance

内容:一个子类从其超类继承所有 成员(字段,方法和嵌套 类)。 构造函数不是成员,因此它们 不会被子类继承,但是 超类的构造函数可以从子类调用 。

12

其他答复是正确的,Java不会让你继承构造函数。但IDE可以用来帮助减轻为所有课程创建这些负担的巨大负担。

在Eclipse中,进入“Source”菜单并选择“从超类生成构造函数...”。在使用对话框创建新班级时,您也可以选择此选项作为选项。

+5

嗯......一个人的“巨大负担”是另一个人的微不足道的任务。 – 2009-09-06 09:47:41

+0

在IntelliJ IDEA中,您可以按Alt + Insert并选择构造函数。这将弹出一个菜单,您可以选择一个或多个父构造函数来实现,并且这些将自动创建。 – Patrick 2013-08-06 21:26:15

0

如果您有一个要分配的默认值,您可以在调用参数化构造函数的基类中创建一个空构造函数。

这将删除需要子类来调用参数化的构造函数。