我有以下类(class):
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
是 AbstractFruitData
类型。我可以转换,但是否可以在 Java 中编写代码,其中 setData
或 getData
方法将在编译时仅对 AppleData 进行操作?
第二个问题:是否有任何设计模式可以用更好的架构代替这种类结构?
最佳答案
您应该能够说服编译器让您访问 getGarden
通过插入 T
进入AbstractFruit<T>
在 Fruit
的声明中,像这样:
class Fruit<T extends FruitData> extends AbstractFruit<T> {
String colour; // ^
} // Here is the change --------------+
一旦您做出此更改,您的类将编译并运行良好 (demo on ideone)。
就问题的第二部分而言,管理并行类层次结构没有 Elixir ;您让调用者将类与其数据配对的方法非常合理,因为用户可以完全访问类及其数据。
您可以通过使用接口(interface)代替您的一些基类来获得一些灵 active ,但最终如果两个类需要相互了解,则没有通用的方法将其抽象为更高层的类层次结构。
关于java - 类中的逻辑和数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23835202/