private List<Fruit> myFruit = new Vector<Fruit>();
好的,如果我有一个不同类型的水果对象列表,我怎么能浏览列表并比较不同的对象。
public class Fruit{
String type;
String color;
}
public class Grape extends Fruit{
int seedCount;
public Grape(Attributes attributes){
this.type = attributes.getValue("type");
this.color=attributes.getValue("color");
this.seedCount=attributes.getValue("seedCount");
}
public class Banana extends Fruit{
String color;
public Banana(Attributes attributes){
this.type = attributes.getValue("type");
this.color=attributes.getValue("color");
}
public load(localName name, Attributes attributes){
if (name.equalsIgnoreCase("grape"){
Grape grape = new Grape(attributes);
myFruit.add(grape);
}
if (name.equalsIgnoreCase("banana"){
Banana banana = new Banana(attributes);
myFruit.add(banana);
}
}
那么我将如何在Fruit列表中进行排序并根据它们的对象类型显示这些对象的特定属性。 IE浏览器。如果type = Grape显示seedCount。
答案 0 :(得分:3)
如果要对Fruit进行排序,则需要为Fruit类实现Comparable接口。
如果要显示属性,请在Fruit类中使用抽象方法,并在子类中提供实现。 这种方式取决于Fruit的实例,它将显示相应的属性。
公共抽象类Fruit实现了Comparable {
public abstract void displayProperties();
@Override
public int compareTo(Fruit otherFruit){
return 0;
}
}
public class Banana extends Fruit {
private int seedCount;
@Override
public void displayProperties() {
// TODO Auto-generated method stub
System.out.println(seedCount);
}
}
public class Grape extends Fruit{
private String color;
@Override
public void displayProperties() {
// TODO Auto-generated method stub
System.out.println(color);
}
}
答案 1 :(得分:0)
您可以向Fruit displayProperties()
然后你将被迫为所有类型的水果捏造方法,然后在你的for循环中你只需要调用displayProperties()
答案 2 :(得分:0)
不建议这样做,但您可以使用
if(object instanceof Class) {
Class temp = (Class) object
//operate on object
}
但你应该做的是创建一个水果界面,可以访问与所有水果相关的重要信息,一般情况下你不应该抛弃它来获取额外的信息。
虽然向下倾斜不是邪恶的,但它可能意味着你没有充分利用多态性。要利用多态性,应确保子类型共享的超类型具有获取所需信息或行为的方法。
例如,假设您有一个HousePets列表,HousePets由子类型Dog和Cat组成。你循环遍历这个列表,并希望摇摆可以摇尾巴的HousePets的所有尾巴。为简单起见,有两种方法可以做到这一点,或者只有Dog有方法'wagTail()'(因为Cats不会摇尾巴),或者HousePets有一个叫做'wagTail()'的方法,它由Cats and Dogs继承(但猫的版本什么都不做)。如果我们选择第一个示例,代码将如下所示:
for(HousePet pet : petList)
if(pet instanceof Dog) {
((Dog)pet).wagTail();
}
对于第二个例子,它看起来像这样:
for(HousePet pet : petList)
pet.wagTail();
第二个示例需要的代码少一些,并且更加简化。在最糟糕的情况下,如果我们选择第一个选项,我们将需要一个if-block用于HousePet的每个新子类型,这将使代码更笨重/更丑陋/等。更好的是,我们可以使用名为“showHappiness”的HousePet方法,并且当猫咕噜咕噜时,狗会摇尾巴。
答案 3 :(得分:0)
我认为你需要一个instanceof
运营商。它允许您检查对象类型。
if (list.get(0) instanceof Grape) {
// list.get(0) is Grape
}