【问题标题】:What's wrong with how I'm using Inheritance in Java?我在 Java 中使用继承的方式有什么问题?
【发布时间】:2015-03-16 13:41:23
【问题描述】:

抱歉,我知道这段代码可以在这里和那里显着缩短,我只是还没有真正了解继承的真正工作原理。

我的问题是,我该如何做到这一点,以便我的 machoke 和 machop 类中的方法不会打印出那些冗余的统计信息。

public class FP {
    public void string() {
        System.out.println("A Standard fighting pokemon's stats are:");
    }

    public double weight() {
        double fWeight = 65;
        System.out.println("Weight: " + fWeight);
        return fWeight;
    }

    public double arm() {
        double fArm = 21;
        System.out.println("Arm Reach: " + fArm);
        return fArm;
    }

    public double leg() {
        double fLeg = 22;
        System.out.println("Leg Reach: " +fLeg);
        return fLeg;
    }

    public double punch() {
        double fPunch = 40;
        System.out.println("Punch Damage: " + fPunch);
        return fPunch;
    }

    public double kick() {
        double fKick = 35;
        System.out.println("Kick Damage: " + fKick);
        return fKick;
    }

    public double bodySlam() {
        double fBodySlam = 150;
        System.out.println("Body Slam damage: " + fBodySlam);
        return fBodySlam;
    }
}



public class Machop extends FP {
    public double DMG_MULTI = 1.5;

    public void string() {
        System.out.println("Machop's stats are:");
    }

    public double bodySlam(){
        double fBodySlam = super.bodySlam()*DMG_MULTI;
        System.out.println("Body Slam damage: "+fBodySlam);
        System.out.println();   
        return fBodySlam;
    }
}


public class Machoke extends Machop {
    public void string() {
        System.out.println("Machoke's stats are:");
    }

    public double weight() {
        double fWeight = super.weight()*1.75;
        System.out.println("Weight: " + fWeight);
        return 0;
    }

    public double arm() {
        double fArm = super.arm()*1.75;
        System.out.println("Arm Reach: " + fArm);
        return fArm;
    }

    public double leg() {
        double fLeg = super.leg()*1.75;
        System.out.println("Leg Reach: " +fLeg);
        return fLeg;
    }

    public double punch() {
        double fPunch = super.punch()*1.75;
        System.out.println("Punch Damage: " + fPunch);
        return fPunch;
    }

    public double kick() {
        double fKick = super.kick()*1.75;
        System.out.println("Kick Damage: " + fKick);
        return fKick;
    }

    public double bodySlam() {
        double fBodySlam = super.bodySlam()*2;
        System.out.println("Body Slam damage: " + fBodySlam);
        return fBodySlam;
    }

    public double submission(){
        double fSubmission = super.bodySlam()*1.5;
        System.out.println("Submission damage: " + fSubmission);
        System.out.println();   
        return 0;
    }
}


public class Call {
    public static void main(String args[]) {
        FP fp = new FP();
        fp.string();
        fp.weight();
        fp.arm();
        fp.leg();
        fp.punch();
        fp.kick();
        fp.bodySlam();
        System.out.println();

        Machop a = new Machop();
        a.string();
        a.weight();
        a.arm();
        a.leg();
        a.punch();
        a.kick();
        a.bodySlam();

        Machoke b = new Machoke();
        b.string();
        b.weight();
        b.arm();
        b.leg();
        b.punch();
        b.kick();
        b.bodySlam();
        b.submission();
    }
}

输出:

标准战斗口袋妖怪的统计数据是:
重量:65.0
臂展:21.0
腿部伸展:22.0
冲击伤害:40.0
踢腿伤害:35.0
身体猛击伤害:150.0

Machop 的统计数据是:
重量:65.0
臂展:21.0
腿部伸展:22.0
冲击伤害:40.0
踢腿伤害:35.0
身体猛击伤害:150.0
身体猛击伤害:225.0

Machoke 的统计数据是:
重量:65.0
体重:113.75
臂展:21.0
臂展:36.75
腿部伸展:22.0
腿部伸展:38.5
冲击伤害:40.0
冲击伤害:70.0
踢腿伤害:35.0
踢腿伤害:61.25
身体猛击伤害:150.0
身体猛击伤害:225.0
身体猛击伤害:450.0
身体猛击伤害:150.0
身体猛击伤害:225.0
提交伤害:337.5

【问题讨论】:

  • 这是一个真的长样本,这让我们很难找到问题所在。您能否给出一个简短但完整的示例,例如只需一个方法调用? (听起来输出是由于super调用...如果您不希望您的方法写出输出,请不要这样做...)
  • 另外,请正确格式化您的代码示例,这样更容易阅读。
  • 回答你的问题"how do I make it so that the methods within my machoke and machop class don't print out those redundant stats.":删除超类FP的方法中的System.out.println

标签: java inheritance super redundancy system.out


【解决方案1】:

您的大多数(如果不是全部)函数都调用 super。因为每个实现都有一个System.out.println(...) 语句,所以你的输出被阻塞了。

一般来说,在类的 super 中调用被覆盖的方法是不必要的,除非它包含也是覆盖代码的一部分的特定逻辑。

您可以做几件事来清理您的代码。对于初学者,请创建类 FP abstract。 (为了便于阅读,您可能还应该将该类重命名为 FightingPokemon。)将类抽象化将阻止您实例化它。您不想创建 FightingPokemon 实例,因为这只是一个包含所有口袋妖怪逻辑的超类。您只需要实际口袋妖怪的实例,例如 Machop 和 Machoke。

其次,您应该删除所有System.out.println 代码。将其替换为每个类中的toString 实现,它会一次性打印所有信息。这也将允许您将打印这些统计信息与调用函数分开。

【讨论】:

    【解决方案2】:

    摆脱所有println 语句并使用printStats 之类的例程

    void printStats() {
        System.out.println("A Standard fighting pokemon's stats are:\n" + 
            "weight: " + weight() + "\n" + ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-18
      • 1970-01-01
      • 2016-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-15
      • 1970-01-01
      相关资源
      最近更新 更多