2017-07-21 36 views
-2

我是一个相当新的Java,并且正在使用继承的项目。现在有三种不同的类 - 顶级Car级,中级CarPart级,以及继承CarPart类的较低级Engine类。我想让Engine类仅仅表示组件行为/状态。我希望CarPart类是通用的 - 以处理多个不同的部分(现在我只有引擎设置)。现在,我希望代表汽车部件(比如引擎)的每个类都从一个名为“CarPart”的超类继承。 CarPart类将具有所有类型汽车零件共享的所有状态和行为(如条件和打印诊断报告的能力)。在java中使用继承的类

下面是我的车类,我希望能够创建零件对象

public class Car { 
    Engine engine; 

    public Car() { 
    engine = new Engine(); 
    } 

    public void run() { 
    this.engine.printStatus(); 
    } 
} 

下面是我想成为通用于所有类型的汽车零件和现在我只想我的CarPart类打印零件的状态。

public class CarPart { 
    private Object object; 

    public String printState(Object object) { 
    System.out.println("The status is "+object.getState()); 
    } 

} 

下面是我的引擎类的代码:

public class Engine extends CarPart{ 
    private String state; 

    public String getState() { 
    if(!state.equals(null)) { 
     System.out.println("The engine is "+state); 
    } else { 
     this.state = "off"; 
     System.out.println("The engine is off"); 
    } 
    return state; 
    } 

    public void setState(String engineState) { 
    this.state = engineState; 
    } 
} 

我认为这个问题有向下转换并没有获得在子类中的方法父类的事 - 但我不知道如何去正确打印状态报告。任何意见将不胜感激!

+0

'公共字符串printState(Object对象)'所以,你可以打印任何对象(字符串,整数,ArrayList中,John3136sSuperDuperSwissArmyKnifeClassOfPain)的状态? – John3136

+0

@ John3136对不起,忘了补充一点。不,我不知道如何从CarPart打印任何对象的状态。我得到的错误“getState()未定义类型对象” – kdubs

+0

CarPart和引擎应该有构造函数。 –

回答

0

移动getState()setState()state成员出Engine “成” CarPart

CarPartprintState(Object object) {变为:

public void printState() 
{ 
    System.out.println(this.state); 
} 

你还没有给我们足够的信息来更进一步。例如,你可以给每个CarPart一个名字,而不用打扰子类。像Engine这样的子类只有在你要添加数据和/或功能时才有意义。例如一个Engine有许多汽缸,可能是一个动力输出,也许是一种燃料类型。 A WindscreenWiper没有任何这些属性。

还要注意的是printState可能不是你想要的。你通常有Car经过它的所有CarPart秒和每一个来电getState(),以便Car可以格式化打印是如何完成的。

+0

下一步是将特定信息添加到子类中,这就是为什么我要这样设置它的原因。我只是试图让一个枯燥的骨头版本开始工作。 – kdubs

+0

好吧,如果不回答这个问题,你需要更具体地说明什么是不工作以及你想要做什么。 – John3136

-1

由于您的错误消息“的getState()是未定义的类型对象”,这是因为:

public class CarPart { 
    private Object object; 
    public String printState(Object object) { 
     System.out.println("The status is "+object.getState()); 
    } 
} 
在4号线,你上 Object参考使用 Engine的方法

Object类没有该方法,所以它是无效的。你可以把它当作System.out.println("The status is "+((Engine)object).getState());(但如果对象不是Engine,你可能会得到一个异常)或者改变你的类。

public class Car { 
    private Engine engine; 
    public void run() { 
     System.out.println(engine.getState()); 
    } 
} 
public abstract class CarPart { 
    public String getState(); 
} 
public class Engine extends CarPart { 
    private String state; 
    public String getState(){ 
     if(state== null) state= "off"; 
     return state; 
    } 
} 
+0

这将是很高兴知道投票的原因,所以我可以提高我的编码技能。如果可以的话,请告诉我为什么你投下了我的答案。 – MiguelKVidal

+0

我不是下台选民,但也许是因为你没有真正解决这个人的问题,你只是提出了一个完全不同的方法。 – csmckelvey

+0

@csm_dev好点。但我在评论中给了他一个“答案”......我会试着澄清它。谢谢! – MiguelKVidal

0

注意:我自己是java的初学者,所以我可能不是100%正确的。

从我理解上继承,对象引用类型(基准变量的类型,而不是的对象被称为)确定哪些方法可用来在对象上执行。例如,引用变量Object对象只能使用Object类(它是所有java类的超类)中定义的方法。但是,您不能在Object对象上调用getState()方法,因为此方法不包含在Object类中。 getState()在Engine的子类中定义,因此仅适用于Engine对象。因此,我建议你制作CarPart类的抽象类,并在该类中实现getstate()和printState()方法,然后在每个子类(对应于每个汽车部件)中重写这些方法。

class abstract CarPart { 
    abstract String printState(Object object); 
    abstract String getState(); 
} 

class Engine extends CarPart { 
    String getState() { 
     //code 
    } 

    String printState() { 
     //code 
    } 
} 

而且,因为你最终会拥有的不仅仅是引擎子多了,我建议你简单地创建自该部分的个人类的每个对象,而不是创建一个汽车类来做到这一点。可能有更高效的方法来使用单个类来创建不同类型的对象,但我目前还没有意识到这一点。