课堂上的逻辑和数据

用户名

我有以下课程:

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

这是错误,因为data是type AbstractFruitData我可以强制转换,但是在Java中是否可以编写代码,在哪里setDatagetData方法在编译时只能在AppleData上运行?

第二个问题:是否有任何设计模式可以用更好的体系结构代替类的这种结构?

谢尔盖·卡里尼琴科(Sergey Kalinichenko)

您应该能够说服编译器允许您访问getGarden通过插入TAbstractFruit<T>中声明Fruit,如下所示:

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

做出更改后,您的类将编译并运行良好(ideone上的演示)。

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

通过使用接口代替某些基类,您可能会获得一定的灵活性,但是最终,如果两个类需要彼此了解,则没有一种通用的方法可以将其抽象为层次结构中更高的类。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章