Método Consttrutor - Uma Dúvida

Olá, pessoal,

Estou com uma dúvida na construção de uma aplicação simples que exige orientação a objetos.
nessa aplicação deve-se fornecer os dados de uma movimentação bancária que são as seguintes:

Para a agência:

  • Código da agência
  • nome da agência

Para a guia:

  • Número
  • Data
  • Hora

Para o movimento:

  • Tipo
  • Taxa
  • Transportadora
  • Valor

Com isso construi as classes Agencia, que será a superclasse, a classe Guia, que herdará os atributos da classe Agencia, e a classe Movimento, que herdará os atributos da classe Guia. Essa última, pelo que estudei, também herdará os atributos da superclasse Agencia.

Ok, construi as classes, montei um método construtor na classe Guia para capturar os dados dela e também da superclasse Agencia.
Mas quando fui montar o construtor da classe movimento o Eclipse dá um erro na linha em que está declarado o construtor. O erro é o seguinte:

O superconstrutor implícito Guia() está indefinido. É necessário chamar explicitamente outro construtor.

Pretendo pegar essas informações e exibí-las em uma interface chamada Armazena que possui um método relat para a exibição.
Ainda não acabei de escrever o código, mas estou intrigado, por que dá esse erro na classe Movimento e não dá na classe Guia ?.
Depois de resolver esse problema escrevo os métodos necessários às chamadas desses métodos construtores para fazer a entrada de dados.

Alguém poderia dar uma ajuda aí, por favor ?

Abaixo eu coloco os códigos fontes das classes da aplicação:

Classe Agencia:

package transporte;

public class Agencia
{
    public long codigo;
    public String agencia;
    
	public static void main(String[] args)
	{
        
	}
}

Classe Guia:

package transporte;
import java.util.Date; // importa a classe Date

public class Guia extends Agencia
{
	public int nro;
    public Date data = new Date(); // Cria objeto do tipo Date
	public String hora;
	
    public Guia(long codigo, String agencia, int nro, Date data ,String hora)
    {
    	super.codigo = codigo;
    	super.agencia = agencia;
    	this.nro = nro;
    	this.data = data;
    	this.hora = hora;
    }
}

Classe Movimento:

package transporte;

public class Movimento extends Guia
{
    public String tipo;
    public String transportadora;
    public double taxa;
    public double valor;
    
    public Movimento(String tipo, String transportadora, double taxa, double valor)
    {
    	this.tipo = tipo;
    	this.transportadora = transportadora;
    	this.taxa = taxa;
    	this.valor = valor;
    }
    
    public static void main(String args[])
    {
    	
    }
}
  1. A Classe Movimento não setou os atributos da superclasse
  2. Não é uma boa acessar os atributos diretamente.

Você deve gerar o construtor de Movimento com todos os atributos de suas superclasses, chamando, na primeira linha do construtor, o comando super(Args), onde os argumentos são os necessário para o construtora da classe pai. Deve fazer tb processo análogo para a classe Gui.

  • Quantas classes você teria para quantos construtores ?

Outra coisa, A classe Guia é uma agência? Se não for, vc não está usando corretmente o conceito de herança. Talvez você devesse usar agragação ou composição em vez de herança. Pelo nome de suas classes, o correto seria a Agência conter guias. Mas a aplicação é sua, então você pode fazer como quiser…hehe

Talvez ficasse mais vantajoso fazer assim:

[code]
public class Agencia
{
public long codigo;
public String agencia;

 public static void main(String[] args)  
 {  
       
 } 

 public Agencia(long codigo, String agencia){
      this.codigo=codigo
      this.agencia=agencia
}
 public Guia gerarGuia(/*colocar aqui somente argumentos da guia*/){

         return new Guia(this.codigo,this.agencia,/*argumentos passados no metodo*/);
 }

} [/code]

Dessa forma, para criar uma guia, vc nao precisaria ficar passando toda hora o nome e codigo da agencia.
Voce poderia fazer algo parecido para a classe movimento.

Espero ter ajudado.

Opa, que bom !

renzonuccitelli, legal a sua dica, infelizmente não posso mexer no código agora. Mas, mais a nite irei trabalhar nisso.
Bem, não sabia que no construtor de uma classe deveria setar todos os atributos da superclasse. Esse tipo de dica é incrível, só aqui no GUJ conseguimos, nenhum professor fala disso.

Com relação a sua dúvida sobre a agencia conter a guia, tem razão, mas estamos começando a estudar orientação a objetos e meu grupo na faculdade ainda se enrola muito, hehe ! Mas é o seguinte, pensamos assim, toda agência possui um número e um nome e toda guia deve conter o número da agencia que a gerou. Por isso pensamos em colocar dessa forma, com a Guia herdando os atributos da Agencia, pois várias agencias geram uma guia com o seu número.

Marcio Duram,

Então, eu teria 4 classes com um construtor para cada uma, de início, uma dessas classes seria a interface. Mas pode ocorrer de uma classe conter mais de um construtor.

Pessoal, valeu aí pela dica, obrigadão mesmo, vou tentar aplicar essas dicas e implementar. Caso precise, acho que vou pedir mais ajuda aqui :smiley:

obrigadão aí.

Valder,

Você nãe é obrigado a setar os valores de todas superclasses, isso depende da sua lógica. No seu caso, se você usar a guia tinha que ter os atributos agencia e código da agência, ambos atributos da superclasse, então sua lógica exige que vc sete os valores dos atributos. Com relação a Herança, você tem que pensar se faz sentido dizer que um objeto da subclasse é um objeto da superclasse.
Ex mais concreto, vamos dizer que vc tivesse a classe banco com um método adicionar agencia, no qual você adiciona agencias para um banco, dessa fora:
Banco banco=new Banco();
banco.adicionarAngencia(new Agencia());

Nesse caso, não faria muito sentido vc usar um Guia no lugar de Agencia, pois Guia não é uma Agência.

Espero ter conseguindo clarificar o conceito.

renzonuccitelli ,

Entendi mais ou menos sua dica, me ambanano ainda, mas beleza, tentarei fazer do seu jeito, que me parece mais limpo.
Agora, me responda, fazendo da maneira que eu estou fazendo, se eu setar os atributos da superclasse na classe Movimento, não precisaria setá-los na classe Guia. Aí vem o erro novamente, dará esse mesmo erro na hora de escrever o construtor da superclasse.
Como faço isso somente usando a classe Movimento ? Quero usar apenas uma classe para escrever o método main, e acho que, nesse meu caso, a classe Movimento seriia a mais indicada.
Depois estudo sua dica bem, pois me parece bem mais limpa e elegante a uma primeira vista.

Muito obrigado mais uma vez, principalmente pelo código que postou aí.

Valder, vc tem que fazer a mesma coisa para as outras classes. O método main vc pode criar em qq classe, inclusive em outra que nao tem nada a ver com suas classes.
Com relação à herança, a idéia é que se uma superclasse é usada para fazer alguma coisa, qq subclasse também é capaz. Pelo menos na noção de Agência e Guia da vida real, isso não faz muito sentido pra mim, mas se fizer pra vc é o que conta. Só dei a dica porque vc pode estar usando de maneira errada.
Fazendo a coisa do jeito que vc quer, temos:

[code]
public class Agencia
{
public long codigo;
public String agencia;

 public Agência(long codigo, String agencia){  
       this.codigo=codigo;
       this.agencia=agencia;
 {  
       
 }  

} [/code]

[code] public class Guia extends Agencia
{
public int nro;
public Date data = new Date(); // Cria objeto do tipo Date
public String hora;

 public Guia(long codigo, String agencia, int nro, Date data ,String hora)  
 {  
     super(codigo, agencia);  
     this.nro = nro;  
     this.data = data;  
     this.hora = hora;  
 }  

}[/code]

[code] public class Movimento extends Guia
{
public String tipo;
public String transportadora;
public double taxa;
public double valor;

 public Movimento(long codigo, String agencia, int nro, Date data ,String hora,String tipo, String transportadora, double taxa, double valor)  
 { 
     super(codigo, agencia,nro,data, hora);  
     this.tipo = tipo;  
     this.transportadora = transportadora;  
     this.taxa = taxa;  
     this.valor = valor;  
 }  

} [/code]

Aí basta vc fazer uma outra classe contendo o método main e instanciar esse método qdo kiser. Perceba que o construtor ficou imenso, e toda vez que vc for criar um movimento vai ter que colocar todos os dados. Se vc colocar em agencia uma lista de guias, vc nao precisaria fazer isso, bastaria chamar um método getGuias obtendo essa lista, pq vc já saberia o código e agencia. Mesma coisa na hora de adicionar.
Mas a arquitetura é sua, vc que decide…

Outra coisa, não é prática comum deixar os atributos publicos, ainda mais que seu trabalho é acadêmico. Com certeza o prof. vai dizer que vc estará violando o encapsulamento…

Espero ter ajudado