【问题标题】:Java - getter from a object attributeJava - 来自对象属性的getter
【发布时间】:2018-04-09 09:08:39
【问题描述】:

我正在使用这些课程:

类克兰特

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;
    }
}

米隆班

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 订阅。目前,我无法检索他们订阅的最新消息。

首先想到的是:

piet.getAbbonement().getNiveau()

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

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

【问题讨论】:

  • 这确实不起作用,因为 getter 没有在抽象类中定义。有什么阻止您在抽象 Abbonement 类中定义 getNiveau 方法吗?
  • 目前没有,但是 Niveau 是特定于类的,其他的没有那个属性
  • @MrEmper 如果是这种情况,你不能调用getNiveau()而不先转换为Milon
  • 这个转换应该可以工作:((Milon)(piet.getAbbonement())).getNiveau()
  • 完美,就像一个魅力! @Dropout 我知道,但我不得不用荷兰语写这个,对不起。谢谢大家的反应。

标签: java class object inheritance abstract


【解决方案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 更像是一种务实的 hack,而且风格很糟糕:在那个地方,额外的信息太具体了。

【讨论】:

    【解决方案2】:

    您可以尝试类似的方法:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-04
      • 1970-01-01
      • 2015-10-15
      • 1970-01-01
      • 1970-01-01
      • 2015-12-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多