代码之家  ›  专栏  ›  技术社区  ›  Carlo del Mundo

Java继承问题

  •  0
  • Carlo del Mundo  · 技术社区  · 14 年前

    假设我有下列课程:

    class car1 {}
    class car2 {}
    class car3 {}
    class car4 {}
    

    支持我也有方法:queryCar()

    private Object queryCar()
    {
         int version = getCarVersion(); // returns car version
         if (version == 1)
             return new car1();
         else if (version == 2)
             return new car2();
         else if (version == 3)
             return new car3();
         ...
    }
    

    我有另一个方法,doStuff()

    private void doStuff()
    {
         // psudocode
         if queryCar() returns a car1, I want to create a JPanel with an instance member of type car1
    }
    

    我如何完成所说的psudocode?InstanceOf用于确定类。但是,我只希望一个类在runttime上自动生成汽车。(Java中模拟C++指针的思考)

    3 回复  |  直到 14 年前
        1
  •  0
  •   Alan Geleynse buhbang    14 年前

    你可以用 instanceof 具有 Object 就像你所做的,但是这样的车界面可能更容易使用:

    interface Car {}
    class Car1 implements Car {}
    
    private void doStuff {
        Car car = queryCar();
        if(car instanceof Car1) {
            Car1 theCar = ((Car1) car);
            theCar.car1OnlyMethod();
            //Or
            ((Car1) car).car1OnlyMethod();
        }
    }
    
        2
  •  5
  •   jjnguy Julien Chastang    14 年前

    你应该用继承做你需要做的事。

    abstract class Car {
        public Car queryCar();
        public int getCarVersion();
        public void doStuff() {
            JPanel j = new JPanel();
            j.add(new JLabel(queryCar().getCarVersion()));
        }
    }
    
    class Car1 extends Car {
        public Car queryCar() { return new Car1(); }
        public int getCarVersion() { return 1; }
    }
    
        3
  •  0
  •   Cameron Skinner    14 年前

    这取决于你们之间有多少共同的行为 carN 上课。在Java中,所有东西都会自动扩展对象,因此您总是有一个公共基类,但对象可能不是 有用的 共同的基础。

    一般来说,把共同的行为放在, Car 并在每个子类中添加或重写特定于版本的行为。

    编辑:在 doStuff 方法你应该仔细考虑 真正地 需要检查子类。如果每个子类都需要不同的行为,则很难维护,因此应该考虑是否可以将一些逻辑移到 卡恩 班级或 小型车 超类并移除依赖项。如果你能写你的 火山灰 在更一般的方面 小型车 接口/超类,那么您的代码将更干净,更容易理解和维护。