这是接受还是合法的

时间:2011-03-20 07:03:00

标签: java oop inheritance polymorphism

我在课堂上有一个方法说

// super class
public class Car{

    public void printMe(Car c){
          if(c instanceof BMW){
            Utility.printString("Bmw");
      }else if(em instanceof VOLVO){
            Utility.printString("Volvo");
      }else if(em instanceof AUDI){
            Utility.printString("Audi");
      }else {
            Utility.printString("Kia");
        }
    }

// sub classes 

public class Bmw extends Car{

}

public class Volvo extends Car{
}

public class Audi extends Car{
}

public class Kia extends Car{
}

}

现在我有一个不同的类,它循环遍历汽车列表并根据汽车的类型打印正确的陈述

public class AccessCars{
   ArrayLists<Car> carsList = listOfcars();

for(Car car: carsList){
   car.PrintMe(car);   
}

}

在上面的循环中,我在汽车上调用printMe(Car c)方法将汽车作为参数。这样做是合法的吗?如果没有,最好的方法是什么?

感谢您的回答

7 个答案:

答案 0 :(得分:3)

更好的方法是:

public abstract  class Car {
public abstract void printMe();
}
public class Audi {
@Override
public void printMe() {
Utility.printString("Audi");
}

这是OOP方式 - 使用多态
请注意,Car是printMe()

的隐式参数

答案 1 :(得分:3)

在这种情况下,我会建议不要使用多态 - 每个类都以相同的方式打印出一个字符串。行为是不变的 - 只有打印的值会有所不同。因此,正确的方法(IMO)是由printMe打印出来的变量,每个派生类只是恰当地初始化变量。

答案 2 :(得分:2)

这是合法的,但不是很好的设计。也许更好的方法是定义抽象方法Car.getModel()并在每个子类中实现它以返回适当的值。毕竟,您不希望每次添加新子类时都必须更改Car的代码。

答案 3 :(得分:2)

嗯,你可以这样做......但我认为你错过了继承和重写方法:

public class Car{

    void printMe()
    {
        System.out.println("I'm a Car!");
    }
}

public class Audi extends Car{

    void printMe()
    {
        System.out.println("I'm an Audi!");
    }
}

for(Car car: carsList){
    car.PrintMe()
}

您获得了覆盖方法。每辆车都会打印出它的名字。

话虽如此,这是一个愚蠢的例子,只是为了说明它是如何运作的。

您确实声明Carabstract并且printMe()是抽象的,除非您有理由直接实例化Car

答案 4 :(得分:1)

这样做通常是不可接受的;既然你已经有了“专门”类,为什么不把printMe方法放在这些类中呢?如果你想强制执行子类有自己的printMe版本,只需将超类中的printMe方法作为抽象。

另一方面,您可能感兴趣的另一件事是Visitor pattern

  

面向对象编程和   软件工程,访客   设计模式是一种分离方式   来自对象结构的算法   它运作。一个实际的结果   这种分离是添加的能力   对现有对象的新操作   结构没有修改那些   结构。这是一种轻松的方法   遵循开放/封闭原则。

答案 5 :(得分:0)

绝对不行,这样做。

我会在超类上定义一个名为.Print()的抽象方法,这样Car的每个子类都必须覆盖它,并且有自己的打印方式。就像上面的许多样品一样!

答案 6 :(得分:0)

这是合法的,但不是最佳实践。 instanceof是对运行时环境的繁重操作,因此应尽可能避免。这里不需要这样做,因为每个Car实例都做同样的事情 - 打印自己。考虑这个例子:

public class Car {
  // do some great stuff here...

    public abstract String printMe();
}

public class Audi extends Car {
  // do some great stuff here...

  public String printMe() {
    return "Audi rocks!";
  }
}
// same for the other car models...

现在迭代Car集合并为每个集合运行printMe。