Можно ли заставить производный класс наследовать производный член от его базового класса в Java? - PullRequest
3 голосов
/ 11 мая 2010

У меня есть код, который выглядит так:

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 ]

4 голосов
/ 11 мая 2010

Вы можете сделать это лучше с помощью дженериков.

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, позволяет вам получать доступ к функциям B в BWrapper без сохранения дополнительной ссылки.

0 голосов
/ 11 мая 2010

В вашем классе BWrapper вы должны удалить строку public B member;. А в методе doMoreStuffWithMember() замените строку на:

((B) member).doMoreStuff();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...