Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以让派生类从Java中的基类继承派生成员吗?_Java_Class_Inheritance - Fatal编程技术网

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

我可以让派生类从Java中的基类继承派生成员吗?,java,class,inheritance,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 wa

我有如下代码:

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

使用泛型可以更好地实现这一点

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();
    }
}
public class AWrapper
{
公共事务委员会成员;
公共说唱歌手(T成员)
{
this.member=成员;
}
公共无效doStuffWithMember()
{
a、 doStuff();
}
}    
公共类BWrapper扩展包装器
{
公共说唱歌手(B成员)
{
超级(成员);
}
公共无效doStuffWithMember()
{
成员:doMoreStuff();
}
}

子类包装器指定B的类型这一事实允许您访问BWrapper中B的函数,而无需存储额外的引用。

在类
BWrapper
中,您必须删除行
公共B成员。在方法
doMoreStuffWithMember()
中,将行替换为:

((B) member).doMoreStuff();

不一定。你可以将包装器泛化为任意多个层次,但是如果你在进行这种编码,你可能是在对域进行错误的建模。啊,对不起,我对我过去的经验感到困惑,我不想将二级类泛化为可读性问题。是的,一个人愿意将
bwraper
generic设置为可以正常工作的。这个语法是什么意思<代码>公共类
?我只在之后才看到类型参数identifiers@Eric我混淆了泛型类型的静态方法声明的语法和类声明格式。编辑以修复。是的,但我仍然在其他地方看到过这种语法。它是否合适,还是仅仅是一个常见的错误?@Jherico:但在这种情况下,您可以确定它是
B
的一个实例。您不能像这里写的那样确定,因为
AWrapper.member
public
,可以设置为非
B
实例。如果属性受
保护
,您甚至不会安全,因为
BWrapper
的某些子类可以设置该属性。