无法实现或扩展 - java

时间:2015-09-11 18:24:52

标签: java inheritance implements

我有一个班级C,有很多成员(比如10个成员)+只有C的成员

我还有两个课程AB,其中包含上述10个成员。 (A和B各有10个成员。这10个成员分布在A和B中,A和B几乎没有其他领域)

class C {
    private int member1;
    private String member2;
    private String member3;
    private float member4;
    ...
    private String member10;

    private member11_only_in_C;
    private member12_only_in_C;
    ...
}



class A {
    private String memeber10;
    private float member4;
    private double member6;
    ....
}
class B {
     private int memeber1;
     private String memeber2;
     private String member7;
     ....
 }

所以当我cObject时,我需要设置AB中所有成员的值,如

aObject.setMember10(cObject.getMember10());
bObject.setMember1(cObject.getMember1());
... and so on for all 10 members

这看起来很糟糕(很长时间以后如果我向C,A,B添加更多成员,我需要为它们编写setter)。所以我的想法是如果我有C级extend or implement A and B我可以cast喜欢

 A aObject = (A)cObject;
 B bObject = (B)cObject;

但问题是

  1. Java不允许多重继承
  2. 我不能将AB作为接口,因为我需要设置它们的值。 (如果我将它们作为接口,它们的成员将变为final,这意味着我无法更改它们的值)
  3. 我无法扩展一个类并实现其他类。 (然后我无法设置界面成员的值)
  4. 我现在能做什么?

    谢谢..

2 个答案:

答案 0 :(得分:1)

根据我的理解,你有两个课程AB,两个课程都有很多字段,你想要创建第三个课程C,其中所有字段都是{{ 1}}和A

正如您所指出的那样,您不能在Java中继承这样做,因为不支持多重继承状态。

您可以使用合成来做类似的事情。

B

我不确定这是一个好主意还是你需要的东西。我们需要有关您的用例的更多信息。

修改

如果public final class C { private final A a; private final B b; public C(A a, B b) { this.a = a; this.b = b; } ... void setMember7(String s) { b.setMember7(s); } String getMember7() { return b.getMember7(); } ... } A的字段不在B,则可以创建一个包含C和{{A2共有字段的A个字段1}}和一个C类,其中包含B2B共有的所有字段,如下所示:

C

答案 1 :(得分:0)

我不知道你想要什么,但我认为你需要的东西可以在构造函数中完成

Class A{
 private member1;
 private member10;
 Class A(){
 }
 Class A(C cObject){
  member1 = cObject.getMember1();
  //the rest of member varaibles you want to set
  member10 = cObject.getMember10();
  }
}
Class B{
 private member1;
 private member10;
 Class B(){
 }
 Class B(C cObject){
  member1 = cObject.getMember1();
  //the rest of member varaibles you want to set
  member10 = cObject.getMember10();
  }
}

使用它: -

 B objectB = new B(objectC);
 A objectB = new A(objectC);