2016-01-30 54 views
1

比方说,我们有这样从现有实例和新的类实例新实例改变现有的类PARAMS

public class foo { 
    int number = 0; 
    public void setNumber(int number) { 
     this.number = number; 
    } 
} 

public class bar extends foo { 
    /* Some other utilities added to the foo class */ 
    public bar() { 
     super(); 
    } 
} 

的设置,我们有这个任务运行

Scheduler.schedule(1000/* Every second */,() -> { 
    fooManager.forEach(f -> System.out.println(f.getNumber())); 
}) 

现在,如果我们这样做:

Foo fo = new foo(); 
fooManager.store(fo); 
Bar ba = new bar(); 

我怎样才能让ba访问fo在方法,无需在ba存储fo,做ba.getFoInstance().setNumber()ba.setNumber()代替

说明V2:我想ba.setNumber()打电话fa.setNumber()

寻找这样的事情:Bar ba = fo,但你不能这样做,因为它抛出ClassCastException

+0

'super()'将调用foo类的构造函数。你可以通过'super.setNumer(...)'来调用'setNumber()'方法。 – user2004685

+0

@ user2004685“fooManager”中存有'foo',所以如果你编辑栏,它不会编辑'foo'列表中的foo元素。编辑 - 也不会有效果,因为'ba.setNumber()默认调用超级方法 – DeprecatedLuke

+2

目前还不清楚你在这里要做什么。即使'ba'和'fo'是不同的对象,并且没有在'ba'内存储'fo'的引用,你想'ba.setNumber()'实际执行'fo.setNumber()'? –

回答

2

在我看来,你试图实现的是一个proxy object。 为什么你不想在Bar类的实例中保留对Foo的引用?它可能是有意义的东西是这样的:

public class Bar extends Foo { 

    private Foo fa; 

    public bar(Foo fa) { 
     super(); 
     this.fa = fa; 
    } 

    @Override 
    public void setNumber (int number) { 
     fa.setNumber(number); 
    } 

    @Override 
    public int getNumber() { 
     return fa.getNumber(); 
    } 
} 

你也应该避免Bar延伸Foo,他们应该简单地都实现所共享的常用方法相同的接口。

+0

已经做到了,但这不是我要找的答案 – DeprecatedLuke

0

不知何故,bafo需要保持参考相同的number变量。因此,ba保留对fo的引用,或者foba都保留对包含number的通用对象的引用。

+0

现在,我终于在'Bar'中存储了'Foo',我想我们需要等待克隆或Reflections可能的结果 – DeprecatedLuke

+0

我建议您保持简单。尝试使用最简单的Java功能,以便您的代码不是基于反思魔术。如果您发现面向对象的常规构造不适合,请再次查看面向对象的设计。也许你的班级结构可以改进。 –

相关问题