不想在子类中使用构造函数

时间:2012-10-15 16:30:36

标签: java constructor super

在我的程序中,我有4个类,如下所示:

  • class Bank
  • class Branch extends Bank
  • class Customer extends Branch
  • class Loan extends Customer

如果我想添加Customer,那么我将从main函数中提供所有参数。像:

customer(bank name, bank add, branch number, brunch add, customer info...)

在此构造函数中,银行的信息通过使用Bank的{​​{1}}和Customer构造函数转到Branch类,依此类推。

问题是当我创建super()类扩展Loan类时,我没有使用任何构造函数,我也不想使用它,因为我只想要来自Customer类的一个变量。但是我的编译器显示了这个错误,它说使用构造函数来获取CustomerBankBranch的构造函数的所有参数。

如何在不使用Customer类中的任何构造函数的情况下解决此问题?

3 个答案:

答案 0 :(得分:1)

避免在Customer类中使用Loan构造函数的最简单方法是扩展Customer。在决定要扩展的类时,如果有的话,你应该使用“是一个”测试。例如,BranchBank,因此拥有class Branch extends Bank是有意义的。但是,LoanCustomer并不真正有意义,因此您不应该class Loan extends Customer。另一方面,Customer有一个Loan;实际上,Customer可能有多个Loan或根本没有Loan。这意味着在List类中有一个Loan成员变量(或者Customer {{1}} {{1}},如果您已经了解了Container API)是有意义的

答案 1 :(得分:0)

你必须修改你的OO思想:

Branch扩展了Bank,好吧我可以忍受它,但可能不是一个好主意(也许装饰模式是更好的方式)

客户扩展分支,这是不正确的(试着想真实的......)分支机构将拥有一个客户集合,并且可能客户有一个现场分支,具体取决于您的需求。

贷款扩展了客户,这是不正确的,如上面的客户可以拥有一系列贷款,并且贷款可能有一组客户,具体取决于您的需求。

所以我建议你检查你的对象模型。

请注意,如果您确实需要2路引用只是一个好主意,但由于我不知道您的要求,我无法为您决定。

有些文章要阅读:

Decorator pattern

Composition over inheritance

答案 2 :(得分:0)

不要使用继承,请对这些类使用引用:

class Bank {
    private List<Loan> loans;
}

class Loan {
    private Customer customer;
}

你可以用不同的方式建模:银行有一个客户列表,一个贷款清单,一个贷款有一个客户或一个客户有一个贷款清单等。但重要的是,一个类应该只当它是“那种”类型时延伸另一个:狗可以延伸动物,但狗不会延伸狗窝或食物。

执行此操作时,您可以创建一个Bank,在构造函数中将其属性传递给它。然后创建一个Customer,仅将Customer属性传递给其构造函数。要将客户与银行关联,请将此方法添加到银行:

public void addLoan(Loan loan) {
    this.loans.add(loan);
}

然后每个类的构造函数只需要它自己的属性。