2011-02-10 2 views
0

У меня есть подкласс, называемый saveaccount. Я хочу, чтобы метод (addInterest) в сберегательном счете ссылался на поле в суперклассе, называемом балансом. В нем говорится, что баланс имеет частный доступ. Как мне обойтись, чтобы избавиться от этого? Мне не разрешено устанавливать поле в суперклассе на что-либо другое, кроме частного. Любая помощь приветствуется. Это метод в сберегательном счете.Метод java подкласса, ссылающийся на поле в суперклассе help!

public void addInterest() 
{ 
    deposit(balance * interestRate/100); 
} 
+1

вместо публикации нового вопроса, отредактируйте [ваш старый] (http://stackoverflow.com/questions/4959558/java-calling-a-method-in-a-sublcass) –

+0

Возможный дубликат [java - вызов метода в подклассе] (http://stackoverflow.com/questions/4959558/java-calling-a-method-in-a-subclass) –

ответ

1

Вы можете добавить геттер в суперкласс? Если это частное дело не доступен - период - так что вы будете иметь, либо сделать его защитой, или добавить метод GET:

public class YourSuperClass { 
    public YourType getSuperClassField() { 
     return superClassField; 
    } 
} 

(Технически вы могли бы использовать отражение - но это было бы действительно плохая идея здесь, IMO)

+0

getSuperClassField() требует типа возврата. В зависимости от того, какой тип поля «баланс» находится в суперклассе, вы можете столкнуться с проблемами, если вы возвращаете объект ref; Если поле является примитивным типом, оно безопаснее, потому что вы возвращаете значение, а не ref, нет? –

+0

@Viktor, спасибо, хороший улов о возврате типа. –

+0

Кроме того, если вы хотите показывать данные суперкласса производным классам, то защищенная область видимости, вероятно, лучше, следуя общему правилу «держите свой API как можно более приватным»? –

1

поставил

protected BalanceType getBalance() { return this.balance; } 

в суперкласса, где BalanceType является типом balance (вы не указали его)

+0

У вас отсутствует тип возврата. :) – limc

+0

Хех. Спасибо - ОП не указал его. –

3

Cr ЭАТС метод получения, как это: -

public abstract class MySuperClass { 
    private float balance; 

    protected float getBalance() { 
     return balance; 
    } 
} 

public class SavingsAccount extends MySuperClass { 
    public void addInterest() { 
     deposit(super.getBalance() * interestRate/100); 
    } 

    private void deposit(..) { 
     ... 
    } 
} 
+0

вам не нужно 'super', если подкласс не переопределяет' getBalance() ' –

+1

@Jason: Вы правы. Я использую его, чтобы проиллюстрировать @robert, что дочерний класс вызывает API суперкласса, иначе он может спросить: «Почему в классе« SavingsAccount »нет' getBalance()? ». :) – limc

1

Вы можете добавить метод геттер, если у вас есть исходный код, как все говорят, в противном случае вы можете использовать отражение для доступа к закрытым членам доступа.

Смежные вопросы