java – 类中的逻辑和数据

我有以下课程:

class AbstractFruitData  {
    int size;
    int weight;
}

class FruitData extends AbstractFruitData {
    String name;
}

class AppleData extends FruitData {
    String garden;

    String getGarden() {
        return garden;
    }
}

class AbstractFruit<T extends AbstractFruitData> {
    T data;

    void setData(T data) {
        this.data = data;
    }

    T getData() {
        return data;
    }
}

class Fruit<T extends FruitData> extends AbstractFruit<AbstractFruitData> {
    String colour;
}

class Apple extends Fruit<AppleData> {
}

如果我写下面的代码:

Apple apple = new Apple();
apple.setData(new AppleData());
apple.getData().getGarden(); <-- error

这是错误,因为数据类型为AbstractFruitData.我可以强制转换,但是在Java中是否可以编写代码,其中setData或getData方法在编译时只能在AppleData上运行?

第二个问题:是否有任何设计模式,这种类的结构可以被更好的架构所取代?

最佳答案 你应该能够说服编译器让你通过将T插入AbstractFruit< T>来访问getGarden.在Fruit的声明中,像这样:

class Fruit<T extends FruitData> extends AbstractFruit<T> {
    String colour; //                                  ^
}                  // Here is the change --------------+

一旦你做了这个改变,你的类将编译并运行正常(demo on ideone).

至于问题的第二部分,管理并行类层次结构没有灵丹妙药;让调用者将数据与数据配对的方法非常合理,因为用户可以完全访问类及其数据.

您可以通过使用接口代替某些基类来获得一些灵活性,但最终如果两个类需要相互了解,则没有通用的方法将其抽象为层次结构中较高层的类.

点赞