我在课堂上有一个方法说
// 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)方法将汽车作为参数。这样做是合法的吗?如果没有,最好的方法是什么?
感谢您的回答
答案 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()
}
您获得了覆盖方法。每辆车都会打印出它的名字。
话虽如此,这是一个愚蠢的例子,只是为了说明它是如何运作的。
您确实声明Car
类abstract
并且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。