Ir ao conteúdo
  • Cadastre-se

Java Java: Problemas com Herança múltipla/Interface


Ir à solução Resolvido por Joanderson Pereira,

Posts recomendados

Estou criando um simples sistema de banco (estudando), nele possuo a classe Conta com alguns métodos e informações básicas da conta (String nome, String cpf, double saldo, getSaldo()), e possuo a classe Sistema onde guardo as contas cadastradas, eu quero criar a classe ContaDiretor que deve ser capaz de estender de Conta (pois é um conta) e de Sistema (será o único a poder alterar variáveis da classe Sistema).

 

Classe Conta

package Conta;

import Banco.Cliente;
import Banco.Data;

public class Conta {
	public int numero;
	protected double saldo;
	public String extrato[] = new String [100];
	public Cliente titular = new Cliente();
	public Data DataDeAbertura = new Data();

	public void depositar (double saldo){
		this.saldo += saldo;

	}

	public double getSaldo(){

		return saldo;
	}



	protected boolean podeSacar(double valor){

		if (saldo < valor)
			return false;
		else
			return true; 

	}

	public void sacar (double valor, Conta conta){
		if (podeSacar(valor)) {

			saldo -= valor;
			System.out.println("Novo Saldo: ");
			System.out.print(conta.getSaldo());
			System.out.println("");

		}    
		else 
			System.out.println("Saldo indisponível");

	}



	public void transferencia (Conta c2){

	}

	public void getExtrato () {

		for (int i = 0; i < extrato.length; i++) {
			if (extrato[i] == null){
				break;
			}
			else
				System.out.println(extrato[i]);

		}



	}

	public void setExtrato(String nome, String atividade, double valor) {

		String extrato = nome + " " + atividade + " " + Double.toString(valor);
		for (int i = 0; i < this.extrato.length; i++) {
			if (this.extrato[i] == null) {

				this.extrato[i] = extrato;
				break;
			}

		}


	}
	public void setExtrato(String nome, String atividade, double valor, String nome2) {

		String extrato = nome + " " + atividade + " " + Double.toString(valor) +" para "+ nome2;
		for (int i = 0; i < this.extrato.length; i++) {
			if (this.extrato[i] == null) {

				this.extrato[i] = extrato;
				break;
			}

		}


	}

	public boolean contaequals(Conta a){

		return (this.titular.login == a.titular.login);        
	}
}

Classe Sistema

package Banco;

import Conta.Conta;

public class Sistema{
	
	public Conta contas[] = new Conta[100];
	public Conta contaPublic = new Conta();
	
	private String nomeBanco = "Banco do Brasil"; //QUERO QUE O DIRETOR SEJA O UNICO CAPAZ  DE ALTERAR NOMEBANCO
	private int totalContas = 0;			//E O UNICO CAPAZ DE RECEBER TOTALCONTAS (FORA A CLASSE SISTEMA)
	
	public String getNomeBanco() {
		return nomeBanco;
	}
	
	public void adicionaConta(Conta conta){

		this.contas[totalContas] = conta;
		totalContas++;


	}

    
    public Conta getConta(int pos) {
    	return contas[pos];
    }
    
    public Conta[] getContaVetor() {//retorna o vetor inteiro
    	return contas;
    }
    
    
}

Conheço muito pouco interfaces, eu tentei criar uma porém descobrir que todas as variáveis em uma interface são "final", ou seja não é possível alterar seu valor. Se eu crio um método abstrato (na interface) setNomeBanco ou getTotalContas, como é que ContaDiretor irá visualizar esses atributos se eles só existem em Sistema?

Não quero deixar NomeBanco e TotalContas public, pois quero que apenas seja possível chamar na classe ContaDiretor e na classe Sistema.

 

Como ContaDiretor terá acesso a duas classes ao mesmo tempo?

 

Segue abaixo o esboço da classe ContaDiretor e da interface InterfaceSistema:

package Conta;

import Banco.InterfaceSistema;

public class ContaDiretor extends Conta implements InterfaceSistema{
	public static String nomeDoBanco;
	
	public void setNomeDoBanco(String nome) {
		this.nomeDoBanco = nome;
		// TODO Auto-generated constructor stub
	}
	
	public String getNomeBanco() {
		
	}
	
	

}
package Banco;

import Conta.Conta;

public interface InterfaceSistema {

	
	public String getNomeBanco();
	
	public void adicionaConta(Conta conta);
	
	public Conta getConta(int pos);
	
	public Conta[] getContaVetor();
	
	
	

}

 

Link para o comentário
Compartilhar em outros sites

  • Solução

TÓPICO DUPLICADO**

Interface apenas define o que fazem as classes que a implementam, meu erro realmente foi falta de conhecimento do que era uma interface.

Consegui resolver o problema criando um package para Sistema e ContaDiretor, mudando atributos/métodos como contas[ ] e totalContas para protected.

ContaDiretor continua herdando de Conta e agora tem acesso exclusivo a atributos/métodos da classe Sistema

package Sistema;

import Conta.Conta;

public class Sistema{
	
	protected Conta contas[] = new Conta[100];
	public Conta contaPublic = new Conta();
	
	protected String nomeBanco = "Banco do Brasil";
	protected int totalContas = 0;
	
	public String getNomeBanco() {
		return nomeBanco;
	}
	
	public void adicionaConta(Conta conta){

		this.contas[totalContas] = conta;
		totalContas++;


	}
	//...
}
package Sistema;

import Banco.Banco;
import Conta.Conta;

public class ContaDiretor extends Conta{
	public static String nomeDoBanco;
	
	public void setNomeBanco(String nome) {
		Banco.reg1.nomeBanco = nome;
		// TODO Auto-generated constructor stub
	}
	
Link para o comentário
Compartilhar em outros sites

@Joanderson Pereira Olá. Maneira bem inteligente que usou para ajustar seu projeto

Fiz uns pequenos ajustes na classe Conta e ficou assim (só mudar como quiser):

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class Conta {

    private int numeroConta;
    private double saldo;
    protected List<String> extrato = new ArrayList<>(); // As vantagens de usar uma List é que não precisa definir um tamanho fixo
    protected Cliente titular = new Cliente();
    protected Date dataDeAbertura = new Date(); // aqui poderia ser uma String para armazenar a data 

    public Conta() {

    }

    public Conta(Cliente titular, int numeroConta, Date dataDeAbertura, double saldo) {
        this.titular = titular;
        this.numeroConta = numeroConta;
        this.dataDeAbertura = dataDeAbertura;
        this.saldo = saldo;
    }

    public void depositar(double valor) {
        this.saldo += valor;
    }

    protected boolean podeSacar(double valor) {
        if (saldo < valor)
            return false;
        return true;
    }

    public void sacar(double valor) {
        if (podeSacar(valor)) {
            saldo -= valor;
            System.out.println("Novo saldo após o saque: " + getSaldo());
            System.out.println("");
        } else {
            System.out.println("Saldo indisponível");
        }
    }

    public void transferir(double valor, Conta conta) {
        if (podeSacar(valor)) {
            saldo -= valor;
            conta.depositar(valor);
        } else {
            System.out.println("Saldo insuficiente para realizar a operação");
        }
    }

    public double getSaldo() {
        return saldo;
    }

    public int getNumeroConta() {
        return numeroConta;
    }

    public String getExtrato() {

        for (int i = 0; i < this.extrato.size(); i++) {
            if (extrato.get(i) != null) {
                return extrato.get(i);
            }
        }        
        return null;
    }

    // aqui deixo para você implementar, pois não entendi o que você quer aqui

//	public void setExtrato(String nome, String atividade, double valor) {
//
//		String extrato = nome + " " + atividade + " " + Double.toString(valor);
//		for (int i = 0; i < this.extrato.size(); i++) {
//			if (this.extrato.get(i) == null) {
//				// this.extrato = extrato;
//				break;
//			}
//
//		}
//
//	}
//
//	public void setExtrato(String nome, String atividade, double valor, String nome2) {
//
//		String extrato = nome + " " + atividade + " " + Double.toString(valor) + " para " + nome2;
//		for (int i = 0; i < this.extrato.size(); i++) {
//			if (this.extrato.get(i) == null) {
//				// this.extrato = extrato;
//				break;
//			}
//		}
//	}
//
//	public boolean contaequals(Cliente a) {
//
//		return (this.titular.login == a.titular.login);
//	}

}

E aqui um teste de algumas coisas que foram definidas na classe Conta:


public class Aplicacao {

    public static void main(String[] args) {

        Conta c1 = new Conta();
        Conta c2 = new Conta();

        c1.depositar(1000);
        c2.depositar(2000);

        c1.sacar(200);

        c2.transferir(500, c1);

        System.out.println("Saldo conta 1: " + c1.getSaldo());
        System.out.println("Saldo conta 2: " + c2.getSaldo());

        System.out.println();

        c1.transferir(3000, c2);
        c2.sacar(500);

        System.out.println("Saldo conta 1: " + c1.getSaldo());
        System.out.println("Saldo conta 2: " + c2.getSaldo());

    }

}

 

Link para o comentário
Compartilhar em outros sites

Realmente é melhor usar ArrayList, mas como eu não conhecia direito, preferi fazer meu próprio vetor, ainda vou adaptar para ArrayList no código.

O método setExtrato adiciona uma String em um vetor de Strings (que cada conta tem) sempre que uma operação é realizada, algo tipo "Fulano depositou tanto na conta de Deltrano". O getExtrato é chamado no menu principal e ele exibe o vetor de Strings da conta que está logada.

Quanto a classe Data estou um pouco indeciso sobre o que vou fazer com ela, creio que vou deixá-la como String e criar uma classe Time que poderá ser usada no setExtrato por exemplo

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...