我有一个ImageA类和一个ImageB类。这两个类代表我的应用程序中的图像,但每个都以不同的方式。即使是不同的,它们的构造函数也是相同的,并且都有比较的方法。
所以,我所做的是创建一个类Image,ImageA和ImageB是Image的子类。
public abstract class Image {
protected String path;
public Image(String path){
this.path = path;
}
public abstract double compare(Image i2);
}
public class ImageA extends Image{...}
public class ImageB extends Image{...}
但我需要的是测试图像的每个实现(在这种情况下为ImageA和ImageB),以查看最佳实现。
有没有办法做到这一点,至少更改我的代码?假设使用的对象来自ImageA类,我想现在测试imageB类;
Obs。:
如果我的应用的所有imageA对象都是 由类型设置(ImageA i = new ImageA()),我必须改变 手动全部在代码中。
但即使我使用superType和 施展它(Image i =(ImageA)new Image()),我会遇到同样的问题, 改变演员阵容。
我的问题与此不同:Refactoring abstract Java class with many child classes。在我的例子中,子类中的属性是不同的,我在Image类中保留这些类的通用属性。
答案 0 :(得分:3)
您可以使用以下命令创建工厂并将工厂实例传递到测试类中:
Image img = factory.newInstance(args);
整个测试代码。工厂确定使用ImageA或ImageB中的哪些类型。另一种方法是在abstract Image newInstance(args)
类中使用Image
并在子类中实现它。在这种情况下,您可以将第一个图像实例注入测试类中。
这两种方法都依赖于两种类型的图像之间的args相同的事实,您可能需要传入一个超集来实现两种构造函数。
答案 1 :(得分:3)
如果这是一个选项(也许我没有得到问题),你应该使用factory method pattern来获得适当的具体课程。披萨样品是自我解释:
abstract class Pizza {
public abstract int getPrice(); // count the cents
}
class HamAndMushroomPizza extends Pizza {
public int getPrice() {
return 850;
}
}
class DeluxePizza extends Pizza {
public int getPrice() {
return 1050;
}
}
class HawaiianPizza extends Pizza {
public int getPrice() {
return 1150;
}
}
class PizzaFactory {
public enum PizzaType {
HamMushroom,
Deluxe,
Hawaiian
}
public static Pizza createPizza(PizzaType pizzaType) {
switch (pizzaType) {
case HamMushroom:
return new HamAndMushroomPizza();
case Deluxe:
return new DeluxePizza();
case Hawaiian:
return new HawaiianPizza();
}
throw new IllegalArgumentException("The pizza type " + pizzaType + " is not recognized.");
}
}
class PizzaLover {
/*
* Create all available pizzas and print their prices
*/
public static void main (String args[]) {
for (PizzaFactory.PizzaType pizzaType : PizzaFactory.PizzaType.values()) {
System.out.println("Price of " + pizzaType + " is " + PizzaFactory.createPizza(pizzaType).getPrice());
}
}
}
Output:
Price of HamMushroom is 850
Price of Deluxe is 1050
Price of Hawaiian is 1150
答案 2 :(得分:1)
我在理解你的问题时遇到了一些困难。我在这里总结一下你的问题陈述,如果这确实是你的问题,请发表评论 (我会把它作为评论,但字符数超过600)
ImageA
和ImageB
是Image
ImageA
和ImageB
使用不同的属性来表示图像
ImageA
和ImageB
保存在基类中(如路径属性)
compare
,它以Image
类型作为参数,
返回一个double值
ImageA
类型ImageB
的比较方法,返回值将指示哪个具体的图像表示更好。所以这意味着compare
方法的实现应该是这样的,compare
类中的ImageA
方法将使用类型ImageB
的实例调用,反之亦然。班级ImageB
ImageA
和ImageB
中的比较方法无法使用Image
中的方法,因为它们具有不同的属性
如果这个问题陈述确实代表你的问题,那么我认为没有诉诸instanceof
之类的检查并且强制转换它将无法在类ImageA
和{{1}之间进行比较}。虽然有一个抽象类ImageB
,但Image
方法仍取决于子类用于表示图像的图像属性(不相同)。