Нужно ли обращаться к защищенным полям в абстрактном суперклассе, используя супер или это в подклассах? - PullRequest
0 голосов
/ 13 ноября 2018

Предположим, у меня есть следующий абстрактный класс.

public abstract class Account {
    protected String Id;
    protected double balance;

    public Account(String Id, double balance) {
        this.Id = Id;
        this.balance = balance;
    }
}

И следующий подкласс

public class CheckingAccount {

    public CheckingAccount(String Id, double balance) {
        super(Id, balance)
        if(super.balance > 10_000) this.balance += 200;
    }
}

И "this", и "super" разрешены в контексте подкласса, когдадоступ к защищенному члену.Лучше использовать один над другим?'super' делает явным, откуда берется это полеЯ понимаю, что могу просто использовать balance без указания неявного параметра, но мне было просто интересно узнать, как это используется на практике, если кто-то хотел указать неявный параметр.

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Поскольку CheckingAccount наследует защищенное поле balance от учетной записи, поэтому НЕ НУЖНО использовать super или это ключевое слово для доступа к балансу поля в классе CheckingAccount.Однако я предпочитаю 'this'.

Если в классе Account (базовый класс) есть защищенный метод, а в классе CheckingAccount есть его переопределенный метод, вам придется осторожно использовать super или это в данном случае, потому что они не являются одной и той же реализацией тела!

0 голосов
/ 13 ноября 2018

Я бы сказал, что вы не должны использовать поля protected для принудительной инкапсуляции. Если бы метод protected void addToBalance(double value) был бы более чистым.

Мне было просто интересно, как это используется на практике, если кто-то хотел указать неявный параметр

По некоторым академическим причинам, вот где это имеет значение:

public abstract class Account {
    protected String Id;
    protected double balance;

    public Account(String Id, double balance) {
        this.Id = Id;
        this.balance = balance;
    }
}

public class CheckingAccount {
    // overwrite existing field
    protected double balance;

    public CheckingAccount(String Id, double balance) {
        super(Id, balance);
        this.balance = balance;
        if(super.balance > 10_000) this.balance += 200;
    }
}
...