2011-12-29 51 views
0

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

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

问题:是否有一些干净利落的方法来自动复制所有引用,也许有一些反射机制来防止未来的bug?

+0

我不知道我是否明白你在这里试图做什么。但是,在子类中使用'super'会让你访问超级类。 \t'公共类A { \t \t \t \t公共无效测试(){ \t \t \t \t \t} \t} \t \t公共类别B延伸的{ \t \t公共B(){ \t \t \t super.test(); \t \t} \t}' – Dimitry 2011-12-29 17:13:48

+0

不带构造函数的丑陋选项是clone()。 http://www.go4expert.com/forums/showthread.php?t=5424 – Stefan 2011-12-29 17:38:51

+0

在超类中有复制构造函数,并从子类的复制构造函数中调用此复制构造函数而不是您要查找的内容?或者我不完全了解你的问题?如果你可以描述你想要解决什么问题,那么问题可能会更加清楚 – Robin 2011-12-29 20:04:13

回答

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可以延长美孚或(更好)theyr应该实现一个共同的接口,但是这不是必需的。

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

+0

是的,你得到我的问题,但我不想委派,因为类是否是一个干净的继承。这只是大量额外的代码,其中一行功能委托给另一个实例。如果“破碎”克隆是我唯一的选择,我真的只想提取一个通用界面。但是我会回顾一下代码,也许一个干净的界面会使一些访问模式过时并且编译成一个整洁的界面。 – 2011-12-29 18:01:34