【问题标题】:How to implement multilevel inheritance using design pattern如何使用设计模式实现多级继承
【发布时间】:2014-08-24 11:43:16
【问题描述】:

我之前在简单的问题上实现了抽象工厂模式并且它很有效。所以我试图用同样的东西来解决这个问题,但我很困惑。我编写了底层类,但对如何将它们组合成一个程序感到困惑。我应该怎么做?应该怎么做?

我正在使用 Java 编写代码来计算税收。我有基类TaxPayer。纳税人可以有多个incomeSourceTaxPayerIncomeSource 可以有多种类型。可以有许多不同收入来源的收入标题作为其属性,将存储在数据库中。 taxableIncome的不同纳税人类型和金额的税率会有所不同。

基类纳税人定义为

public abstract class TaxPayer {
    private List<IncomeSource> incomeSource;
    double taxRate;
    Address address;
    other attributes here;

    public Double getTaxRate(){
        return 0.25; //default tax rate
    }
}

public abstract class IncomeSource {
    private String incomeSourceName;
    private Double incomeHeading1, incomeHeading2, incomeHeading3;
    private Double totalIncome = incomeHeading1 + incomeHeading2 + incomeHeading3;
}

可以有更多级别的IncomeSource 继承与不同的收入标题。同样的纳税人类型可以建模成如下继承结构

Base Class: Taxpayer
    * IndividualPerson
        * Male, Female, OldAge
    * Business
        * Bank, ITIndustry, HydroElectricIndustry
    * TaxFree
        * SocialOrganization, ReligiousOrganization, PoliticalParty etc.

TaxPayer 的子类一般会修改taxRate 以应用于taxableIncome,有时还会通过一些逻辑更改taxableIncome。举个例子:

abstract class IndividualPerson extends TaxPayer{
    if (incomeSource.taxableIncome > 250000) taxRate = ratex;
    if (incomeSource.taxableIncome > 500000) taxRate = ratey;
    @override
    public getTaxRate() {
        return taxRate;
    }
}
class Female extends IndividualPerson {
    if (incomeSource.getNumberOfIncomeSource() > 1) taxRate = taxRate + rate1;
    else taxRate = taxRate - rate2
    if (address.isRural() = true) taxRate = taxRate - rate3;
    if (attributeX = true) taxRate = taxRate + rate4;
    if ("Some other attribute" = true) taxableIncome = taxableIncome - someAmount;
}

我们必须检查TaxpayerIncomeSource 的其他属性以确定taxRate。大多数情况下,taxRate 对于不同的逻辑是不同的,但有时,taxableIncome 可以打折。

我正在尝试根据 TaxPayer 类型和 taxableIncome 返还税率。我很困惑如何将底层类组合在一起。

【问题讨论】:

  • 为什么会有如此复杂的层次结构——例如,MaleFemale Taxpayer 类如何添加任何东西?我认为你需要重新考虑你的类——你需要考虑什么时候可以有一个参数。 Effective Java(large pdf) 第 16 条:优先组合而不是继承。例如,在您的 Male/Female 案例中使用 enum
  • 男性和女性的税率不同。所以我认为拥有这些会更好。怎么改成组合而不是继承?
  • 这可以通过添加税率变量来解决。如果您尝试将每个变量描述为层次结构,您最终会陷入混乱。应该使用层次结构来改变行为而不是状态
  • 那么,将 getTaxRate() 替换为 Double taxRate 应该是正确的做法吗?
  • 我想我在MaleFemale 和其他继承TaxPayer 类的类中会有更复杂的逻辑。我想要带有继承的多态性。可以用enum实现吗?

标签: java oop inheritance design-patterns


【解决方案1】:

Taxpayer 创建为parent interface,层次结构中的下面三个将实现它。这个taxpayer 接口将有一个getTaxRate() 方法,需要由所有子类实现。

您可以将business 类作为另一个接口扩展父taxpayer 接口,并使bank,hydroelectricity 类扩展business 接口。

每个bank,hydroelectricity 等都将有一个final float 和所需的税率。

假设 A 是一个在银行有业务的人员类,那么在这种情况下

A implements Bank

这将提供特定于 A 银行的税率。

但更好的选择是将bank,hydroelectricity 等作为ENUMSbusiness 类下实现Taxpayer 接口。

更好的方法

public enum Business {
        BANK(10.1), ITINDUSTRY(8.1), HYDROELECTRICITY(1.3);
        private float value;

        private Business(int value) {
           this.value = value;
        public float getTaxRate(){
           return this.value;
        }
};   

class A implements TaxPayer{
     public String occupation = "BANK";

    //implemented from parent taxpayer 
    public float getTaxRate(){
        return Business.BANK.getTaxRate();
    }
}

如果纳税人下的隔离不重要,那么您可以将所有最低级别的班级都归入一个 ENUM 下。

做类似上面的事情。希望它能给你一个更清晰的想法。

【讨论】:

  • 我认为这根本不正确。 taxRate 是一个变量而不是一种行为——为此使用类层次结构不是正确的方法。
  • 同意使用层次结构不是一种有利的方法,这就是我建议最后使用 ENUMS 的原因。我也将其解释为层次结构,因为提出问题的人希望以这种方式对其进行建模。至少这是我从问题中理解的。
  • 我不想以某种方式去做,但最好的方式。我的问题可能格式不正确
  • 谢谢你的例子。我可能有更复杂的逻辑来计算税率。此外,继承级别可能会进一步下降。这可以通过enum 实现吗?
  • 您能否将逻辑放在您的问题中,并举例说明您正在尝试做什么。在 ENUMS 中,您可以输入特定于该行业的因素,因此在获取税率时,您可以调用合适的 ENUMS 并利用 ENUMS 对应的值来获得净税率。
猜你喜欢
  • 1970-01-01
  • 2019-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多