A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 系磊 初级黑马   /  2012-8-1 22:46  /  4399 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

我们已经测试了4次了,主要模块的温度还是持续下降,秋香不耐烦的说着,上礼拜就已经安装新的温度感应器,散热器(radiator)的读数反应也没有问题,所以我们把焦点放在恒温器(retention bot)上.华安他了一口气,想起一开始的时候还以为纳米技术可以帮他们超前进度,现在离发射只有5个星期了,卫星的生存维护装置还是没办法通过测试.

  “你用什么比例来模拟?”,华安问到.

  “我知道你要问什么”,秋香回答,“我们也想到了如果不符合规格,任务控制中心不会验收的.我们必须以2:1的比例执行V3版和V2版的radiator测试单元”,秋香继续说,“整体来说,retention与radiator的比例应该是4:3”.

  华安追问:“能源消耗呢?”秋香想一下:“那是另外一个问题,能源消耗速度比预期的快.我们有另外的一组人正在想办法.但是这些无线技术很难将radiator的能源消耗与retention的消耗分离”.
  秋香停了一下又说:“设计上的整体能源消耗率应该是3:2,也就是radiator的能源消耗比较快”.
“好吧,既然这样”,华安说,“那我们在看下放着程序初始化的程序代码.这个问题一定要很快的解决!”
import java.util.*;
class V2Radiator
{
        V2Radiator(ArrayList list)
        {
                for(int x=0; x<5; x++)
                {
                        list.add(new SimUnit("V2Radiator"));
                }
        }
}
class V3Radiator extends V2Radiator
{
        V3Radiator(ArrayList lglist)
        {
                super(lglist);
                for(int g=0;g<10;g++)
                {
                        lglist.add(new SimUnit("V3Radiator"));
                }
        }
}
class RetentionBot
{
        RetentionBot(ArrayList rlist)
        {
                rlist.add(new SimUnit("Retention"));
        }
}
public class TestLifeSupportSim
{
        public static void main(String[] args)
        {
                ArrayList aList = new ArrayList();
                V2Radiator v2 = new V2Radiator(aList);
                V3Radiator v3 = new V3Radiator(aList);
                for(int z=0; z<20; z++)
                {
                        RetentionBot ret = new RetentionBot(aList);
                }
        }
}
class SimUnit
{
        String botType;
        SimUnit(String type)
        {
                botType = type;
        }
        int powerUse()
        {
                if("Retention".equals(botType))
                {
                        return 2;
                }
                else
                {
                        return 4;
                }
        }
}
  把程序看了一遍之后,华安笑了,他说:“我想我知道那是怎么回事了.能源消耗这件事其实也是有关的!”
  大家来看看如何解决这个bug呢?

4 个回复

倒序浏览
这个关于数组的问题就没人来么
回复 使用道具 举报
本帖最后由 侯宪博 于 2012-8-4 02:45 编辑

额,这个。。。
谁看了这个都淡定不了。。。
呵呵。。。
回复 使用道具 举报
首先楼主这个问题不是关于数组的,这个是关于继承的问题
乍一看这个问题是没有头绪的
一是楼主的问题表述不甚清楚
二是没有人能耐心分析其中的奥妙,不能从该事例中提取模型
其实这个例子挺锻炼面向对象思想的。
下面就说说这个bug的所在
首先,散热器的测试是分两个版本进行的
而且比例是二比一
但是问题就出在这
V3版本的测试散热器测试继承了V2版
而且V2版本重载了构造函数
这就致使在测试V3版的时候同时又测试了V2版
致使V3版散热器测试和V2版测试比例成为了1:1
实在需要要继承的话
其实不必在main函数里测试V2版,直接测试V3版就会自动测试V2版
但是建议新建一个散热器父类
分别实现V2版和V3版的测试
这样才符合面向对象的思想
其次,就在于能源消耗
虽说每次测试都试图消耗能源
但是,真正消耗能源的动作却没有做
因为每次测试,消耗能源的方法没有被调用
所以有必要在new SimUnit("Retention")后面加.powerUse()
l楼主这是不是你想要的结果。。。
回复 使用道具 举报
本帖最后由 王志明 于 2012-8-4 03:52 编辑

import java.util.ArrayList;
import java.util.List;

class V2Radiator {
        V2Radiator(List<SimUnit> list) {
                for (int x = 0; x < 5; x++) {
                        SimUnit unit = new SimUnit("V2Radiator");
                        list.add(unit);
                        // 这里应该使用能源
                        unit.powerUse();
                }
        }
}

class V3Radiator extends V2Radiator {
        V3Radiator(List<SimUnit> list) {
                super(list);
                for (int g = 0; g < 10; g++) {
                        SimUnit unit = new SimUnit("V3Radiator");
                        list.add(unit);
                        // 这里应该使用能源
                        unit.powerUse();
                }
        }
}

class RetentionBot {
        RetentionBot(List<SimUnit> list) {
                SimUnit unit = new SimUnit("Retention");
                list.add(unit);
                // 这里应该使用能源
                unit.powerUse();
        }
}

class SimUnit {
        String botType;
        int powerUse;

        SimUnit(String type) {
                botType = type;
        }

        int powerUse() {
                if ("Retention".equals(botType)) {
                        powerUse = 2;
                        return 2;
                } else {
                        powerUse = 4;
                        return 4;
                }
        }
}

public class TestLifeSupportSim {
        public static void main(String[] args) {
                List<SimUnit> list = new ArrayList<SimUnit>();
                // 这里不用写了,因为V3继承了V3,在测试V3的时候也会测试V2
                // 当测试V3时,首先V2会测试5次,然后V3在测试10次,这样V3和V2的测试比例正好是2:1
                // V2Radiator v2 = new V2Radiator(aList);
                V3Radiator v3 = new V3Radiator(list);
                // retention测试了20次,raditor(V2和V3)测试了15次,所以retention与radiator的比例正好是4:3
                for (int z = 0; z < 20; z++) {
                        RetentionBot ret = new RetentionBot(list);
                }

                // 能源消耗
                int retentionPowerUse = 0;
                int radiatorPower = 0;
                for (SimUnit unit : list) {
                        if (unit.botType.equals("Retention")) {
                                retentionPowerUse += unit.powerUse;
                        } else {
                                radiatorPower += unit.powerUse;
                        }
                }
                System.out.println("radiatorPower = " + radiatorPower);
                System.out.println("retentionPowerUse = " + retentionPowerUse);
                // 结果为:整体能源消耗率是3:2(radiator:retention)
                // radiatorPower = 60
                // retentionPowerUse = 40
        }
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马