在 java 中,我可能有一个对象a,它带有一堆属性,比如 getColor。然后我可能会创建第二个对象 b(可能属于同一类),它的行为与对象 a 类似,因为它与 a< 做同样的事情/em> 除非其中一个值被特别更改(并且也未更改)。
a = new Foo()
b = new FooWhichRefersToAnotherFoo(a)
a.getColor() # returns blue
b.getColor() # returns blue
a.setColor(red)
b.getColor() # returns red
b.setColor(pink)
b.getColor() # returns pink
a.getColor() # returns red (unchanged)
b.deleteChangeToColor()
b.getColor() # returns red as it is now pointing back to a
我会假设它是某种树状层次结构,就好像我有 c 指向 b 指向 a,对象会沿着链向上移动到第一个指定值或原始无父对象的默认值。
是否存在与 Java 兼容的类似模式?我希望第一个类是一个类,第二个是一个继承类,它跟踪它正在实例化哪个类,如果没有设置它自己的属性,则查询父对象。
我想我可以自己做这个,我可以创建一个单独的类,比如
class Foo {
Color color = new Color("red");
Color getColor() { color }
}
class FooInstance extends Foo {
Foo parent = null;
FooInstance(Foo parent) {
this.parent = parent;
}
Color getColor() {
if (color == null) return parent.getColor();
else return color;
}
}
但想确保没有更简单的机制,比如使用 javabeans 或其他东西。继承的一个问题是它暴露了父类的所有方法,而我可能想指定哪些方法在子类中实际可用,所以也许只是一个单独的类?
最佳答案
我已经读过你的文章好几遍了,其中有些地方仍然让我感到困惑。例如,在您的 a/b/c 示例中,您谈论行为相同,除非值不同。我认为您需要更清楚地分离行为和状态的概念。行为是类将要执行的操作,状态是其属性的值。一个类的行为如果经常依赖于状态,即:
Color getColor() {
if (color == null) return parent.getColor();
else return color;
}
但它们是两个不同的东西。根据您的示例,我认为您不需要两个或更多不同的类。您可以将 Foo 和 FooInstance 重新编码为一个类,如下所示:
class Foo {
Foo parent = null;
Color color;
Foo(Foo parent) {
this.parent = parent;
}
Color getColor() {
//If there is no parent we have to return color regardless.
if (parent == null) {
return color;
}
// If there is a parent we can choose which to return.
return color == null ? parent.getColor() : color;
}
void setColor(Color color) {
this.color = color;
}
}
除非您需要与 FooInstance 不同的行为,否则您可以使用一个类来完成所需的操作。
我不知道有任何第三方 API 提供这种数据结构。但它们可能存在。
关于java - 实例化另一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4149465/