我可以使派生类从Java的基类继承派生成员吗?

时间:2010-05-11 18:46:46

标签: java class inheritance

我的代码如下:

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中,一个继承的方法可以将其返回类型(可能是参数,但我不确定)缩小到派生类。字段也是如此吗?

2 个答案:

答案 0 :(得分: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 :(得分:0)

在您的班级BWrapper中,您必须删除该行public B member;。在方法doMoreStuffWithMember()中用以下内容替换:

((B) member).doMoreStuff();