2010-05-11 94 views
3

我有代码看起来像这样:我可以让派生类在Java中从其基类继承派生成员吗?

public class A 
{ 
    public void doStuff() 
    { 
     System.out.print("Stuff successfully done"); 
    } 
} 

public class B extends A 
{ 
    public void doStuff() 
    { 
     System.out.print("Stuff successfully done, but in a different way"); 
    } 

    public void doMoreStuff() 
    { 

     System.out.print("More advanced stuff successully done"); 
    } 
} 

public class AWrapper 
{ 
    public A member; 

    public AWrapper(A member) 
    { 
     this.member = member; 
    } 

    public void doStuffWithMember() 
    { 
     a.doStuff(); 
    } 
} 

public class BWrapper extends AWrapper 
{ 
    public B member; 

    public BWrapper(B member) 
    { 
     super(member);   //Pointer to member stored in two places: 
     this.member = member; //Not great if one changes, but the other does not 

    } 

    public void doStuffWithMember() 
    { 
     member.doMoreStuff(); 
    } 
} 

然而,这段代码有问题。我在两处存储了对成员的引用,但如果其中一个发生了变化,另一个则不会发生,则可能会出现问题。我知道在Java中,一个继承的方法可以将其返回类型(也可能是参数,但我不确定)缩小到派生类。田地也是如此吗?

回答

4

您可以使用泛型更好地完成此操作。

public class AWrapper<T extends A> 
{ 
    public T member; 
    public AWrapper(T member) 
    { 
     this.member = member; 
    } 

    public void doStuffWithMember() 
    { 
     a.doStuff(); 
    } 
}  

public class BWrapper extends Wrapper<B> 
{ 
    public BWrapper(B member) 
    { 
     super(member); 
    } 

    public void doStuffWithMember() 
    { 
     member.doMoreStuff(); 
    } 
} 

该子类包装指定B的类型,可以访问在BWrapper B的功能,而不存储的附加引用的事实。

+1

不一定。您可以根据需要将包装器泛化为很多层,但如果您正在进行这种编码,则可能会错误地对域进行建模。 – Jherico 2010-05-11 19:16:28

+0

对不起,我混淆了我过去的经历,我不想将二级课程泛化为可读性问题。是的,一个人愿意让'BWrapper'通用它会正常工作。 – doublep 2010-05-11 19:44:06

+0

这个语法是什么意思? '公众班'?我只看过类型参数_after_标识符 – Eric 2010-05-14 06:24:38

0

在你的班级BWrapper你必须删除行public B member;。并在方法doMoreStuffWithMember()替换行:

((B) member).doMoreStuff(); 
+1

如果你必须演员,你做错了。 – Jherico 2010-05-11 18:59:47

+0

@Jherico:但在这种情况下,你确定它是'B'的一个实例。 – 2010-05-11 19:37:11

+0

由于'AWrapper.member'是'public'并且可以设置为非'B'实例,因此您无法确定此处是否写入。如果属性被“保护”,你甚至不会安全,因为'BWrapper'的某个子类可以设置属性。 – 2010-05-11 20:34:24