【问题标题】:Java shallow copy super class instance for sub class instance子类实例的Java浅拷贝超类实例
【发布时间】:2011-12-29 17:06:05
【问题描述】:

我想将超类的实例传递给子类的构造函数。我的第一个想法是在类似于 javascripts 原型的子类中交换超类的实例,但我被告知 here Java 不支持交换超实例的引用,因为本身没有超实例。

为了规避这个问题,我想使用一个接受超类实例的复制构造器。然后我将不得不手动重新链接所有引用,从长远来看,当其他人扩展超类的代码并忘记子类中的复制构造函数时,这会引发错误。

问题:是否有一些简洁而好的方法来自动复制所有引用,也许有一些反射机制来防止将来出现错误?

【问题讨论】:

  • 我不确定我是否理解你在这里想要做什么。但是在子类中使用super 将使您可以访问超类。 public class A{ public void test(){ } } public class B extends A{ public B(){ super.test(); } }
  • 一个在没有构造函数的情况下工作的丑陋选项是 clone()。 go4expert.com/forums/showthread.php?t=5424
  • 在超类中有一个拷贝构造函数,并且从你的子类的拷贝构造函数调用这个拷贝构造函数不是你要找的吗?还是我没有完全理解你的问题?如果您能描述您要解决的问题,也许问题会更清楚
  • 是的,直接在超类中使用复制构造函数并从子类中调用它更容易。但我想我明天会重构,看看委托接口解决方案是否不能解决问题。复制构造或克隆似乎太乱了。我真的很期待一些 neet 反射技巧。

标签: java inheritance reflection constructor copy-constructor


【解决方案1】:

您不应该将所有引用从超类实例复制到子类实例。顺便说一句,如果将所有这些引用声明为超类中的私有字段(通常应该如此),则所有这些引用甚至都不应该从子类中访问。

您可能需要的是委托,而不是继承:

// Foo is the superclass
private class FooAdapter {
    private Foo foo;

    public FooAdapter(Foo foo) {
        this.foo = foo;
    }

    public void doThis() {
        return foo.doThis();
    }
}

FooAdapter 可以扩展 Foo 或者(更好)它们应该实现一个通用接口,但这不是必需的。

如果这不能解决您的问题,请告诉我们您想做什么,而不是告诉我们您想如何做。你想解决什么问题?

【讨论】:

  • 是的,你明白了我的问题,但我不想委托,因为这些类是一个干净的继承。那将只是大量的额外代码,其中一个行函数委托给另一个实例。如果“损坏的”克隆是我唯一的选择,我真的只想提取一个通用接口。但是我会检查代码,也许一个干净的接口会使一些访问模式过时并编译成一个整洁的接口。
猜你喜欢
  • 1970-01-01
  • 2012-11-19
  • 2012-04-13
  • 2016-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-29
  • 2013-01-26
相关资源
最近更新 更多