【问题标题】:Confusion on using instanceof along with other inherited data混淆使用 instanceof 以及其他继承的数据
【发布时间】:2014-09-12 17:45:25
【问题描述】:

我已经发布过一次关于这个程序的帖子,但我再次陷入了我正在学习的一个新概念上(另外作为旁注;我是一名 CS 学生,所以请不要简单地交给我一个解决方案,因为我的大学有严格的代码复制规则,谢谢。)。我在这个概念上遇到了一些困难,主要是我很难将它实现到我的目的,尽管教科书的例子非常有意义。所以只是对我在做什么的快速解释: 我有一个实体类,它从驱动程序中获取Scanner。然后我的另一个班级将扫描仪交给superclass,它的两个subclasses 然后继承该扫描仪。每个类都有来自Scanner 读取的.txt 中的不同数据。然后这三个类将它们的数据发送到实体以进行最终计算。在读取了所有数据之后,这就是我的问题所在。我有一个显示新输出的方法以及一些从super 及其派生类添加数据的方法。编辑:我根本无法弄清楚如何通过超级调用我的子类的实例变量,所以我可以添加并计算数据。

这是我的四门课程;司机、实体、超级、潜艇:

    public static final String INPUT_FILE = "baseballTeam.txt";

    public static void main(String[] args) {
        BaseballTeam team = new BaseballTeam();
        Scanner inFile = null;
        try {
            inFile = new Scanner(new File(INPUT_FILE));
            team.loadTeam(inFile);
            team.outputTeam();
        } catch (FileNotFoundException e) {
            System.out.println("File " + INPUT_FILE + " Not Found.");
            System.exit(1);

        }
    }

}



public class BaseballTeam {

    private String name;
    private Player[] roster = new Player[25];

    Player pitcher = new Pitcher();
    Player batter = new Batter();

    BaseballTeam() {
        name = "";
    }

    public String getName() {
        return name;
    }

    public void setName(String aName) {
        name = aName;
    }

    public void loadTeam(Scanner input) {
        name = input.nextLine();
        for (int i = 0; i < roster.length; i++) {
            if (i <= 9) {
                roster[i] = new Pitcher();
            }
            else if ((i > 9) && (i <= 19)) {
                roster[i] = new Batter();
            }
            else if (i > 19) {
                roster[i] = new Player();
            }
            roster[i].loadData(input);
            roster[i].generateDisplayString();
            //System.out.println(roster[i].generateDisplayString());  //used sout to test for correct data
        } 

    }

    public void outputTeam() {
        if ((pitcher instanceof Player) && (batter instanceof Player)) {           
               for (int i = 0; i < roster.length; i++) {
            System.out.println(roster[i].generateDisplayString());
        } 
    }

//How do I go about doing calculates?
    public int calculateTeamWins() {        
             if ((pitcher instanceof ) && (batter instanceof Batter)) {

        }


        return 0;
    }

    public int calculateTeamSaves() {
        if ((pitcher instanceof Pitcher) && (batter instanceof Batter)) {

        }
        return 0;
    }

    public double calculateTeamERA() {
        if ((pitcher instanceof Pitcher) && (batter instanceof Batter)) {

        }
        return 0;
    }

    public double calculateTeamWHIP() {
        if ((pitcher instanceof Pitcher) && (batter instanceof Batter)) {

        }
        return 0;
    }

    public double calculateTeamBattingAverage() {
        if ((pitcher instanceof Pitcher) && (batter instanceof Batter)) {

        }
        return 0;
    }

    public int calculateTeamHomeRuns() {
        if ((pitcher instanceof Pitcher) && (batter instanceof Batter)) {

        }
        return 0;
    }

    public int calculateTeamRBI() {
        if ((pitcher instanceof Pitcher) && (batter instanceof Batter)) {

        }
        return 0;
    }

    public int calculateStolenBases() {
        if ((pitcher instanceof Pitcher) && (batter instanceof Batter)) {

        }
        return 0;
    }
}



public class Player {

    protected String name;
    protected String position;

     Player(){        

        name = "";
        position = "";        
    }
    public String getName() {
        return name;
    }

    public void setName(String aName) {
        name = aName;
    }

    public String getPosition() {
        return position;
    }

    public void setPosition(String aPosition) {
        position = aPosition;
    }  

    public void loadData(Scanner input){
        do {

            name = input.nextLine();
        } while (name.equals(""));
         position = input.next();
         //System.out.println(generateDisplayString());
    }

    public String generateDisplayString(){

        return "Name: " + name + ", Position:" + position; 
    }
}


public class Pitcher extends Player {

    private int wins;
    private int saves;
    private int inningsPitched;
    private int earnedRuns;
    private int hits;
    private int walks;
    private double ERA;
    private double WHIP;

    Pitcher() {
        super();
        wins = 0;
        saves = 0;
        inningsPitched = 0;
        earnedRuns = 0;
        hits = 0;
        walks = 0;
    }

    public int getWins() {
        return wins;
    }

    public void setWins(int aWins) {
        wins = aWins;
    }

    public int getSaves() {
        return saves;
    }

    public void setSaves(int aSaves) {
        saves = aSaves;
    }

    public int getInningsPitched() {
        return inningsPitched;
    }

    public void setInningsPitched(int aInningsPitched) {
        inningsPitched = aInningsPitched;
    }

    public int getEarnedRuns() {
        return earnedRuns;
    }

    public void setEarnedRuns(int aEarnedRuns) {
        earnedRuns = aEarnedRuns;
    }

    public int getHits() {
        return hits;
    }

    public void setHits(int aHits) {
        hits = aHits;
    }

    public int getWalks() {
        return walks;
    }

    public void setWalks(int aWalks) {
        walks = aWalks;
    }

    @Override
    public void loadData(Scanner input) {
        super.loadData(input);
        wins = input.nextInt();
        saves = input.nextInt();
        inningsPitched = input.nextInt();
        earnedRuns = input.nextInt();
        hits = input.nextInt();
        walks = input.nextInt();

    }

    @Override
    public String generateDisplayString() {
        calculateERA();
        calculateWHIP();
        return String.format(super.generateDisplayString() + ", Wins:%1d, Saves:%1d,"
                + " ERA:%1.2f, WHIP:%1.3f ", wins, saves, ERA, WHIP);
    }

    public double calculateERA() {
        try {
            ERA = ((double)(earnedRuns * 9) / inningsPitched);
        } catch (ArithmeticException e) {
            ERA = 0;
        }
        return ERA;
    }

    public double calculateWHIP() {
        try {
            WHIP = ((double)(walks + hits) / inningsPitched);
        } catch (ArithmeticException e) {
            WHIP = 0;
        }
        return WHIP;
    }
}


public class Batter extends Player {

    private int atBats;
    private int hits;
    private int homeRuns;
    private int rbi;
    private int stolenBases;
    private double batAvg;

    Batter() {
        super();
        atBats = 0;
        hits = 0;
        homeRuns = 0;
        rbi = 0;
        stolenBases = 0;
    }

    public int getAtBats() {
        return atBats;
    }

    public void setAtBats(int aAtBats) {
        atBats = aAtBats;
    }

    public int getHits() {
        return hits;
    }

    public void setHits(int aHits) {
        hits = aHits;
    }

    public int getHomeRuns() {
        return homeRuns;
    }

    public void setHomeRuns(int aHomeRuns) {
        homeRuns = aHomeRuns;
    }

    public int getRbi() {
        return rbi;
    }

    public void setRbi(int aRbi) {
        rbi = aRbi;
    }

    public int getStolenBases() {
        return stolenBases;
    }

    public void setStolenBases(int aStolenBases) {
        stolenBases = aStolenBases;
    }

    @Override
    public void loadData(Scanner input) {
        super.loadData(input);
        atBats = input.nextInt();
        hits = input.nextInt();
        homeRuns = input.nextInt();
        rbi = input.nextInt();
        stolenBases = input.nextInt();      
    }

    @Override
    public String generateDisplayString() {
        calculateBattingAverage();
        return String.format(super.generateDisplayString() +
                ", Batting Average:%1.3f, Home Runs:%1d, RBI:%1d, Stolen Bases:%1d"
                , batAvg, homeRuns, rbi, stolenBases);
    }

    public double calculateBattingAverage() {
        try{
        batAvg = ((double)hits/atBats);
        } catch (ArithmeticException e){
            batAvg = 0;
        }
        return batAvg;
    }
}

另外,很容易看出我在这里还是个新手,因为我只是将我的所有类与代码示例一起运行,我无法弄清楚添加差距,所以如果需要,请随时编辑是。

【问题讨论】:

  • 一点建议 - 在这种情况下,最好在您的代码示例中添加注释,指出您的问题究竟出在哪里 - 类似于“//我在这里做什么? "在 calculateTeamWins 中发表评论会让您的问题更容易理解。
  • 明白。谢谢你的建议。

标签: java inheritance subclass superclass instanceof


【解决方案1】:

在您描述的场景类型中,instanceof 的典型用法是

if (foo instanceof FooSubclass) {
  FooSubclass fooSub = (FooSubclass) foo;
  //foo and fooSub now are references to the same object, and you can use fooSub to call methods on the subclass
} else if (foo instanceof OtherSubclass) {
  OtherSubclass otherSub = (OtherSubclass) foo;
  //you can now use otherSub to call subclass-specific methods on foo
}

这称为“强制转换”或“显式强制转换”foo 到 FooSubclass。

【讨论】:

  • 以这种方式转换比((子类)超类对象)更好或更传统吗?还是说的完全不同?
  • 还可以在每种方法中一个一个地单独完成显式转换吗?...foo 代表/意味着什么?我看到很多。我了解您在示例中如何使用它,我只是不知道它的缩写。
  • 对于您的第一条评论 - 两者在功能上是相同的。如果您需要访问多个不同的项目,如果您使用我发布的语法(对我来说)更具可读性 - 创建子类类型的局部变量;这样你只需要施放一次。如果您只需要拨打一个电话,那么您使用的语法是常规的。
  • 对于你的最后一个问题——“foo”、“bar”和“baz”本质上是“标准”占位符变量——它们是没有任何意义的随机名称。 wiki 文章“foobar”有一些关于其背后历史的细节 (en.wikipedia.org/wiki/Foobar)
  • 感谢您的帮助和信息。欣赏它。
【解决方案2】:

调用子类方法的概念称为多态性。 在您的运行时中,只要方法名称相同,就会调用最具体的可用方法。

所以你可以

超类 class= 新的子类();

class.method();

并且提供的覆盖超类中方法的方法将被调用,即使它是在子类中定义的。

对不起我的英语,我希望能有所帮助;-)

【讨论】:

  • 它确实有帮助,谢谢 :) 我在检查您的建议时也注意到的一个问题是,我检查了我的课程的错误实例,但我已修复它。顺便说一句,你的英语对我来说似乎很好
猜你喜欢
  • 1970-01-01
  • 2019-12-08
  • 2015-01-17
  • 1970-01-01
  • 1970-01-01
  • 2011-12-30
  • 1970-01-01
  • 1970-01-01
  • 2015-09-18
相关资源
最近更新 更多