代码之家  ›  专栏  ›  技术社区  ›  marionmaiden

在Java中更改类

  •  1
  • marionmaiden  · 技术社区  · 15 年前

    我有一个类ImageA和一个类ImageB。这两个类在我的应用程序中都代表一个图像,但每个类的方式不同。即使是不同的,它们的构造函数也是相等的,并且都有方法 比较 .

    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{...}
    

    但我需要的是测试image的每个实现(本例中是ImageA和ImageB),以查看最佳的实现。

    有没有办法做到这一点,至少改变我的代码?假设使用的对象来自ImageA类,我现在要测试imageB类;

    注意事项:

    • 由类型设置(ImageA i=新建 ImageA()),我得换衣服了 在代码中手动执行所有操作。

    • 但即使我使用超类型和 铸造它(图像i=(图像A)新 Image()),我也会遇到同样的问题, 改变演员阵容。

    • 我的问题与这个不同: Refactoring abstract Java class with many child classes

    3 回复  |  直到 8 年前
        1
  •  3
  •   rsp    15 年前

    Image img = factory.newInstance(args);
    

    abstract Image newInstance(args) 在你的 Image

    这两种方法都依赖于这样一个事实,即两种类型的图像之间的参数相同,您可能需要传入一个超集来实现这两个构造函数。

        2
  •  3
  •   Pascal Thivent    15 年前

    如果这是一个选项(也许我没有得到这个问题),你应该使用 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
    
        3
  •  1
  •   sateesh    15 年前

    我理解你的问题有些困难。我试着在这里总结你的问题陈述,如果这确实是你的问题,请评论。

  • 你有课吗 ImageA ImageB Image
  • (我假定它是图像文件的路径)
  • 班级 ImageA 图像B
  • 公共属性类 ImageA 保留在基类中(如path属性)
  • 您声明了一个抽象方法 compare 形象 键入作为参数和 返回一个双精度值
  • 目的是通过比较的方法 一种 返回值将指示哪个具体的图像表示更好。所以这就意味着 比较 方法应该是这样的:, 课堂教学法 ImageA 将使用类型为的实例调用 图像B 图像B
  • 类中的比较方法 ImageA 图像B 无法在中使用方法 因为它们有不同的属性

    如果这个问题陈述确实代表了您的问题,那么我认为您不需要进行类似的检查 instanceof ImageA . 虽然有一个抽象类 这个 比较 方法仍然取决于子类用于表示图像的图像属性(不同)。