跳过父构造函数来调用祖父母的

Ger*_*man 12 java oop

问题是这样的:我有一个抽象类在它的构造函数中做了一些工作,还有一组实现抽象类的子类:

class AbstractClass {
     AbstractClass(){ /* useful implementation */ }
}

class ConcreteClass1 extends AbstractClass {
     ConcreteClass1(){ super(); /* useful implementation */ }
}
Run Code Online (Sandbox Code Playgroud)

然后,需要定制具体类,一个解决方案是扩展具体类:

class CustomizedClass1 extends ConcreteClass1 {
    CustomizedCLass1(){ super(); /* useful implementation */ }
}
Run Code Online (Sandbox Code Playgroud)

但问题是定制类只需要调用抽象类的构造函数而不是具体类的构造函数.

你是如何实现这一目标的?改变班级关系的建议是有效的.

编辑:具体的例子是ConcreteClass1和CustomizedClass1有不同的数据集(ConcreteData1和CustomizedData1),并从类的构造函数中的数据库中检索它.问题是创建CustomizedClass1的实例将检索两个数据实体.

我知道使用简单的继承可能不是最好的事情,这就是为什么我指出改变类关系的建议是有效的.

Tof*_*eer 21

你不能用Java做到这一点.我经常有学生想要这样做,但我从未见过他们想要做的事情.

你能给出一个具体的例子,说明你想做什么以及为什么(你的描述太模糊),我相信可以实现一个解决方案:-)

编辑:

对于一个真实世界的例子,为什么你不想这样做(通常)将是一个层次结构,如:

Animal (constructor makes the eyes)
  |
Mammal (constructor makes the lungs)
  |
Human (constructor sets the language)
Run Code Online (Sandbox Code Playgroud)

如果Human构造函数可以跳过Mammal构造函数,那么你最终会找到一个没有肺部的人......不是很有用.

  • Animal <-Mammal <-Aquaman:继承Mammal的肺部结构,并实施自己的鳃.;) (13认同)

Mat*_*ght 10

容易(但为什么?):

class AbstractClass {
   AbstractClass(){ /* useful implementation */ }
}

class ConcreteClass1 extends AbstractClass {
     ConcreteClass1(){ super(); /* useful implementation */ }
     ConcreteClass1(boolean skip){ super(); }
}
class CustomizedClass1 extends ConcreteClass1 {
     CustomizedCLass1(){ super(true); /* useful implementation */ }
}
Run Code Online (Sandbox Code Playgroud)

  • 我的慈善猜测是,他可以在ConcreteClass1中对外部资源进行一些初始化,而在CustomizedClass1中,他希望对其他外部资源进行初始化。 (2认同)

Wyz*_*a-- 8

根据定义,任何实例CustomizedClass1也都是实例ConcreteClass1,因此必须在构造函数运行ConcreteClass1之前将其构造为有效实例CustomizedClass1.否则,如果你调用ConcreteClass1方法会发生什么?他们试图对尚未初始化的变量进行操作.

如果您认为自己需要这样做,那么您的设计需要重新思考.ConcreteClass1例如,如果您只想要某些功能,那么该功能可以被分解为超类ConcreteClass1,并且CustomizedClass1可以扩展它以获得它所需的功能.

请提供有关这些类之间关系的更多信息.


小智 7

两条评论:首先,你不应该考虑像这样"跳过"构造函数.其次,它真的听起来像你需要重新考虑你的阶级关系.

每当你发现自己在想"A延伸B,除了......"是一个非常好的时间来进一步研究事物."延伸"意味着"是一种",这是一种或两种关系:具有可选行为会增加灰色区域,以后会咬你.

正如人们所说,你可以在ConcreteClass1上提供多个构造函数来进行每种情况下所需的初始化,也许使它们受到保护,以便它们只能由子类使用.但是这里有一个问题:如果有人想编写CustomClass2需要一些(但不是全部)ConcreteClass1中的功能怎么办?你添加另一个自定义构造函数?