[英]Change classes in Java
我有一个类ImageA和一个类ImageB。 这两个类都代表我的应用程序中的图像,但是每个类以不同的方式表示。 即使它们不同,它们的构造函数也是相等的,并且都具有compare方法。
因此,我要做的是创建一个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类;
观测值:
如果我的应用程序的所有imageA对象都由类型(ImageA i = new ImageA())设置,则必须手动更改所有代码。
但是,即使我使用superType并对其进行了强制转换(Image i =(ImageA)new Image()),我也会遇到相同的问题,以更改强制类型转换。
我的问题与此不同: 重构具有许多子类的抽象Java类 。 就我而言,子类内部的属性是不同的,我将这些类的公共属性保留在Image类中。
您可以使用以下方法创建工厂并将工厂的实例传递到测试类中:
Image img = factory.newInstance(args);
在您的测试代码中。 工厂确定使用哪种类型的ImageA或ImageB。 一种替代方法是在Image
类中具有abstract Image newInstance(args)
并在子类中实现它。 在这种情况下,您需要将第一个图像实例注入测试类。
两种方法都基于这样的事实:两种图像类型之间的arg相同,因此您可能需要传入一个超集来实现两种构造函数。
如果这是一个选项(也许我没听清楚),则应使用工厂方法模式来获取适当的具体类。 披萨样本是自我解释:
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
我很难理解您的问题。 我在这里尝试总结您的问题陈述,如果这确实是您的问题,请发表评论。
(本来可以作为注释,但字符数超过600)
ImageA
和ImageB
类,它们是Image
子类 ImageA
和ImageB
类使用不同的属性来表示图像 ImageA
和ImageB
保留在基类中(例如path属性) compare
,该方法compare
Image
类型作为参数并返回一个double值 ImageA
的比较方法与ImageA
的类型进行ImageB
,并且返回值将指示哪种具体的图像表示形式更好。 因此,这意味着compare
方法的实现应使得ImageA
类中的compare
方法将使用类型为ImageB
实例来调用,反之将成为ImageB
类中的实现。 ImageA
和ImageB
的compare方法不能使用Image
方法,因为它们具有不同的属性 如果这个问题陈述确实代表您的问题,那么我认为如果不诉诸instanceof
和强制转换之类的检查,就无法在ImageA
和ImageB
类之间进行比较。 尽管有一个抽象类Image
, compare
方法仍然取决于子类用来表示图像的图像属性(不相同)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.