用Java更改类

时间:2010-02-04 13:31:29

标签: java inheritance refactoring multiple-inheritance

我有一个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类中保留这些类的通用属性。

3 个答案:

答案 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)

  • 您的班级ImageAImageBImage
  • 的子类
  • 这两个类的构造函数相同,并接受路径参数  (我认为是图像文件的路径)
  • ImageAImageB使用不同的属性来表示图像
  • 公共属性类ImageAImageB保存在基类中(如路径属性)
  • 您声明了一个抽象方法compare,它以Image类型作为参数, 返回一个double值
  • 目标是传递ImageA类型ImageB的比较方法,返回值将指示哪个具体的图像表示更好。所以这意味着compare方法的实现应该是这样的,compare类中的ImageA方法将使用类型ImageB的实例调用,反之亦然。班级ImageB
  • ImageAImageB中的比较方法无法使用Image中的方法,因为它们具有不同的属性

    如果这个问题陈述确实代表你的问题,那么我认为没有诉诸instanceof之类的检查并且强制转换它将无法在类ImageA和{{1}之间进行比较}。虽然有一个抽象类ImageB,但Image方法仍取决于子类用于表示图像的图像属性(不相同)。