繁体   English   中英

更改Java中的类

[英]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)

  • 您有ImageAImageB类,它们是Image子类
  • 这两个类的构造函数都是相同的,并且接受path参数(我认为它是图像文件的路径)
  • ImageAImageB类使用不同的属性来表示图像
  • 通用属性类ImageAImageB保留在基类中(例如path属性)
  • 您声明一个抽象方法compare ,该方法compare Image类型作为参数并返回一个double值
  • 目的是通过将ImageA的比较方法与ImageA的类型进行ImageB ,并且返回值将指示哪种具体的图像表示形式更好。 因此,这意味着compare方法的实现应使得ImageA类中的compare方法将使用类型为ImageB实例来调用,反之将成为ImageB类中的实现。
  • ImageAImageB的compare方法不能使用Image方法,因为它们具有不同的属性

    如果这个问题陈述确实代表您的问题,那么我认为如果不诉诸instanceof和强制转换之类的检查,就无法在ImageAImageB类之间进行比较。 尽管有一个抽象类Imagecompare方法仍然取决于子类用来表示图像的图像属性(不相同)。

  • 暂无
    暂无

    声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

     
    粤ICP备18138465号  © 2020-2024 STACKOOM.COM