java - 实例化另一个对象

标签 java inheritance instance

在 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/

相关文章:

java - 等待 REST 请求 JAVA 的响应

java - 为什么类不能扩展枚举?

java - dbHelper 的静态或实例方法?

java - Android 缓存实例

java - com.fasterxml.jackson.databind.exc.InvalidDefinitionException : No serializer found

java - javafx中的ListView,添加多个单元格

java - 在继承中转换一个对象,为什么会输出这个?

android - "No enclosing instance of type"在Android中从另一个类调用方法时出错

java - Netbeans OptionsPanelController 按钮焦点

c++ - 如何根据容器中对象的类型来判断调用哪个函数?