2012-12-20 77 views
2

当我尝试创建类的实例并将其添加到我的ArrayList时,我无法调用子类中定义的方法。Java调用子类方法

我该如何做这项工作?

List类

import java.util.*; 
public class List { 
    private ArrayList<Person> persons; 
    public List(){ 
    persons = new ArrayList<Person>(); 
    } 
    public void addAssistant(){ 
    Person person = new Assistant(); 
    persons.add(person); 
    if(person instanceof Assistant){ 
     person.assist(); 
    } 
    } 
} 

Person类

public class Person { 
    public Person(){} 
} 

助理类

public class Assistant extends Person { 
    public Assistant(){} 
    public void assist(){ 
    System.out.println("I am assisting!"); 
    } 
} 

Ç ompiler: line:person.assist();在List类的addAssistant()方法中。

编译错误: 编译器找不到符号 - 方法assist()。

+0

我不会把一个类列表,我会用接口 – NimChimpsky

+0

不直接关系到你的问题:如果一个助手,一个人,你可能要考虑,或者如果它是一个人的角色。 –

+0

我可以,但它是一堆代码,高于一个简单的版本,以保持易读。它在行中出错:person.assist();在List类的addAssistant()方法中。编译器找不到符号 - 方法assist()。 – rofavadeka

回答

8

你需要一个明确的转换:

if(person instanceof Assistant){ 
    ((Assistant)person).assist(); 
} 

不过,我认为这种类型的逻辑一般应劝阻。

+0

谢谢。如果我更熟悉java语言,我会记住找到另一种方法!它现在工作正常。 – rofavadeka

1

你有你的Person铸成Assistant这样的:

if(person instanceof Assistant){ 
    ((Assistant)person).assist(); 
} 

这种类型的铸造howerver是有缺陷的应用程序设计的指示,我认为。

只是一个旁注:

您应该使用接口,而不是具体实现。与此

private ArrayList<Person> persons; 

:所以,你应该更换此

private List<Person> persons; 

如果你希望你的Person s到做他们的具体工作和Assistant的工作是帮助比你可以工作在此通过创建抽象方法在Person

public abstract void doYourWork(); 

,并可以实现在Assistant

@Override 
public void doYourWork(){ 
    // doing something 
} 

在这种情况下,你不必明确地投你Person对象。

如果Person不会有任何具体的实现,您可以改为使其成为一个接口。

+0

感谢您的深入解释。 – rofavadeka

1

您需要为使用一个铸件的子方法

if(person instanceof Assistant){ 
    ((Assistant)person).assist(); 
} 
+0

谢谢你的努力,回答所有已经给出的答案。 – rofavadeka

0

的方式Java语言的设计,这并不编译(因为你已经理解了它也一样)。这样想想,所有的助手都是人,但并不是所有的人都是助手。如果你使用明确的演员,你可以做你想做的事情(就像NPE在他的回答中提到的那样)。

+0

感谢您的回复。 – rofavadeka

1

Person类不具有辅助定义的方法,所以你必须明确地转换为助理类如

if(person instanceof Assistant){ 
    ((Assistant)person).assist(); 
} 
+0

感谢您的努力,已经给出了答案。 – rofavadeka

1

我会这样

public void addAssistant(){ 
    Assistant assistant = new Assistant(); 
    assistant.add(person); 
    assistant.assist(); 
} 

有从您最近创建的对象实际上是一个助理的知识提炼自己没有点代码吧。

从具体类型中抽象出自己是减少两段代码之间的耦合的好方法,它对于做多态这样的好事是必要的......但在这个特定的例子中,你向我们展示了你已经紧密耦合到一个助手(实际上你只是将它实例化为两行以上)。

实现这个另一种可能的方法是使用多态,你可以通过添加辅助()方法来你的人的界面做的。

public class Person { 
    public Person(){} 

    public void assist() { 
    //I'm a just a person who doesn't assist anywhere 
    } 
} 

这样你将能够做你正在尝试:

public void addAssistant(){ 
    Person person = new Assistant(); 
    persons.add(person); 
    person.assist();  
} 

不过,我不会建议,大多是因为你将开始与责任尽显你的个人界面,没有正确放置在那里。这完全是设计问题,您需要为您的特定问题选择更好的(当然也是最舒适的)解决方案。

好运 克劳迪奥