Pessoal, antes de mais nada gostaria de agradecer a atenção de todos.
Perdoem-me pela minha última mensagem, porque ela realmente ficou confusa. Para explicar melhor, deixem-me colocar a estrutura de duas classes, omitindo o que não é de interesse para o problema:
package lib;
public class ContaCorrente {
private double saldo;
public double getSaldo() { return this.saldo; }
// *** O problema está em deixar um escopo para setSaldo que somente
// *** esta classe e a sua subclasse, ContaCorrenteEspecial, possam
// *** acessar, e não todas as classes do pacote.
public void setSaldo(double $saldo) { this.saldo = $saldo; }
public boolean saque(double $valor) {
if (this.saldo > $valor) {
this.saldo = this.saldo - $valor;
return true;
}
else
return false;
}
}
package lib;
public class ContaCorrenteEspecial extends ContaCorrente {
private double limite;
public boolean saque(double $valor) {
double saldoAntesDoSaque = this.getSaldo();
if ((saldoAntesDoSaque + this.limite) > $valor) {
double saldoAtualizado = saldoAntesDoSaque - $valor;
this.setSaldo(saldoAtualizado);
return true;
}
else
return false;
}
}
Como os colegas podem ver, eu declarei o método setSaldo na superclasse como público, o que na minha opnião quebra o encapsulamento, afinal qual a diferença entre declarar como público um método que muda o valor de um atributo diretamente ou declarar o próprio atributo como público?
Mudar o método setSaldo para o escopo “default” ou protected daria a todas as classes que fazem parte do pacote lib o direito de acessarem setSaldo diretamente, através de um objeto do tipo ContaCorrente ou ContaCorrenteEspecial, o que quebra o encapsulamento da classe pelo menos dentro do pacote.
O que eu gostaria de fazer é que setSaldo pudesse ser declarado de uma forma que ele não pudesse ser chamado diretamente por nenhum objeto da classe ContaCorrente ou ContaCorrenteEspecial (o que quero dizer com diretamente é utilizar, por exemplo, o objeto x da classe ContaCorrente para chamar setSaldo, ex: x.setSaldo(10.0)), mas somente indiretamente, ou seja, que setSaldo só fosse visível para as implementações de outros métodos das duas classes (o que quero dizer com isso é que somente dentro de um método da classe ContaCorrente ou ContaCorrenteEspecial é que eu poderia chamar setSaldo).
Se eu declarar setSaldo como private em ContaCorrente, eu fico preso a utilizá-lo somente na superclasse. Se declará-lo como protected ou “defaut”, eu o acesso na subclasse, mas em compensação eu também consigo acessá-lo de qualquer outro método de qualquer outra classe dentro desse pacote, desde que essa outra classe crie um objeto do tipo ContaCorrente ou ContaCorrenteEspecial. Isso, na minha opnião, quebra o encapsulamento da classe dentro do pacote em que foi declarada.
Se eu não me engano, em C++ quando você declara um item como protected, só é possível acessá-lo dentro das implementações da classe que o declara e dentro das implementações das suas subclasses. Isso é o que eu realmente queria? Isso é possível em Java?
Atenciosamente,
Reinaldo.