Java - 来自对象属性的getter

时间:2018-04-09 09:08:40

标签: java class object inheritance abstract

我正在使用这些课程:

班级Klant

public class Klant {

    private String naam;
    private String adres;
    private String geboortedatum;
    private double gewicht;
    private int bmi;

    private Abbonement abbonement;

    public Klant(String naam, String adres, String geboortedatum, double gewicht, int bmi, Abbonement abbonement){
        this.naam = naam;
        this.adres = adres;
        this.geboortedatum = geboortedatum;
        this.gewicht = gewicht;
        this.bmi = bmi;
        this.abbonement = abbonement;
    }

    public Abbonement getAbbonement() {
        return abbonement;
    }
}

类Abbonement

public abstract class Abbonement {

    private String begindatum;
    private int contractduur;
    private double maandprijs;

    Abbonement(String begindatum, int contractduur, double maandprijs){
        this.begindatum = begindatum;
        this.contractduur = contractduur;
        this.maandprijs = maandprijs;
    }
}

类Milon

public class Milon extends Abbonement{

    private int niveau;

    public Milon(String begindatum, int contractduur, double maandprijs, int niveau){
        super(begindatum, contractduur, maandprijs);
        if(niveau >= 1 && niveau <= 25) {
            this.niveau = niveau;
        } else {
            this.niveau = 1;
        }
    }

    public int getNiveau() {
        return niveau;
    }
}

现在我有Klant个订阅Milon的对象。目前我无法检索他们订阅的niveau。

首先想到的是:

piet.getAbbonement().getNiveau()

但它不起作用可能是因为它来自我认为的抽象类?

现在我的问题是,如果在Milon对象中出现问题,我如何从Klant返回niveau?

2 个答案:

答案 0 :(得分:1)

你可以尝试类似的东西:

Abbonement abbonement;
int niveau;

abbonement = myKlant.getAbbonement();

if (abbonement instanceof Milon) {
    Milon milon;
    milon = (Milon)abbonement;
    niveau = milon.getNiveau();
} else { 
    niveau = 0; 
}

答案 1 :(得分:1)

如果属性非常普遍,似乎就是这种情况,请将它带到基类。

public abstract class Abbonement {
    public int getNiveau() {
        return 0;
    }
    ...

public class Milon extends Abbonement{

    @Override
    public int getNiveau() {
        return niveau;
    }
}

通常情况下,在基类中会有一个方法,在Milon中重写,以便对niveau和其他字段执行某些操作。比如在Abbonement上显示信息。或者凝结业务逻辑Abonnement.isGoedNiveau()的东西。

向Milon施放Abbonement更加务实,并且风格很糟糕:在那个地方,额外的信息太具体了。