Extends e implementes

12 respostas
igor972

Galera, estou fazendo um exercício, que seria assim:

Criar a classe abstrata Produto que terá como atributos:

int codigo /* código do produto */
double precoCusto /* preço de custo do produto */
Deve ter o construtor e os métodos getters e setters.

Criar a interface Vendavel, que tem como método (abstrato)
getValorVenda( ) /* retorna o valor de venda do produto

Criar a classe Livro, herdeira de Produto, e que implementa a interface Vendavel, que terá os atributos:
String nome /* nome do livro */
String autor /* autor do livro */
String isbn /* isbn do livro */
Deve ter o construtor e os métodos getters e setters.
E deve implementar o método getValorVenda( ), que calcula o preço de venda como sendo o preço de custo do livro mais 10%.

Neste caso, eu crio:

public class Livro extends Produto{


		
	}

Mas como seria implementar a interface Vendavel?

seria uma:

public interface Vendavel implements Livro{

	abstract void getValorVenda( );
	
	
}

Bom, estou tentando resolver mas não entendi esta parte.

Se algum puder ajudar.... Obrigado

12 Respostas

claudneto

Na verdade, a interface possui apenas as assinaturas dos métodos e a classe que implementa essa interface tem o desenvolvimento dos métodos.

//Método na interface
float getValorVenda();

//Método na classe que implementa a interface
float getValorVenda() {
    return valorVenda;
}

Em relação ao extends, se uma classe extende a outra, ela possui todos os métodos e atributos (que não sejam privados). Caso queira alterar algum método, pode apenas criá-lo novamente na classe filho. Caso não precise, apenas chame o método como se fosse um método criado por você na mesma classe.

igor972

claudneto, valew!!!

Mas se o método é VOID, ele tem retorno???

void getValorVenda() { return valorVenda; }

nel

igor972:
claudneto, valew!!!

Mas se o método é VOID, ele tem retorno???

void getValorVenda() { return valorVenda; }

Não, métodos void não retorna nada, por isso o nome “void”.
A interface é um contrato, onde rege que cada classe que a implementar é obrigado a possuir seus respectivos métodos.
Mesmo que não declare, todas os métodos declarados dentro de uma interface são publicos e abstratos e variavéis são publicas, estaticas e finais, ou seja, imutaveis.

Classes abstratas você não é obrigado a ter métodos abstratos, podes ter métodos estáticos ou simplesmente desejar utilizar algo como um Singleton, apesar de ultimamente, existir uma grande discussão sobre Singleton. É uma idéia.

Outra diferença importante, na minha opinião, é que uma classe pode extender exclusivamente uma única classe, entretanto, pode implementar N interfaces.
Abraços!

nel

Só um detalhe, eu sei que foi só um exemplo, mas você não teria um método getAlgumaCoisa() cujo retorno seria void né? :slight_smile:
Poderia ser um

void printString(String word) {}

Algo do tipo, ai é interessante um void.
Abraços.

mausexdd

Vamos lá
Começe sempre pensando oque vai fazer, e por onde iniciar pois muita gente sai programando e nao sabe nem oque esta fazendo,
ou pior ,programa daquela maneira porque alguem falo que era uma "Boa Pratica " mas nao intende nem oque está acontecendo e porque ,E como aquela pratica realmente favorece vc e seu software.

Let's Go!

Começe pela sua Classe "PAI" Produto onde todas as Classes do tipo produtos do seu projeto HERDA desta classe;

/* Aplicação de Herança - todos as suas classes filhas teram acesso aos metodos e atributos da classe pai , como se fosse
uma Herança Obrigatótia : se teu pai é rico , mesmo que voce nao queira voce também é rico !
se tua classe pai possui o atributo*/ private String nome ; /*a filha consequentemente também , mesmo que não utilizar,
o nome vai estar ali !

*/
public class Produto {
	int codigo;/* código do produto */
	double precoCusto; /* preço de custo do produto */

	/*
	 * Foi criado na classe pai , para evitar redundancia , se todo produto
	 * possui precoCusto e codigo , PorQue ficar repetindo o atributo em todas as classes ?
	 */

	/*
	 *" Deve ter o construtor ", 
                    construtor é quando voce obriga a inicialização
	 * dos atributos, pelo programador , OBS* o java ja cria um construtor
	 * implicito , mesmo se voce nao criar o construtor, fazendo isso voce só
	 * indicara com obrigatoriedade a inicialização dos atributos com algum
	 * valor
	 */
	
                 public Produto(int cod, double precoCus) {
		codigo = cod;
		precoCusto = precoCus;
	}
	// e os métodos getters e setters.

	public int getCodigo() {
		return codigo;
	}

	public void setCodigo(int codigo) {
		this.codigo = codigo;
	}

	public double getPrecoCusto() {
		return precoCusto;
	}

	public void setPrecoCusto(double precoCusto) {
		this.precoCusto = precoCusto;
	}
}
mausexdd

Quando voce cria uma interface , nada mais é dos que voce OBRIGAR as classes que implementam " x " interface que ela tera que desenvolver e possuir todos os metodos que estão naquela interface

por ex.

public interface IVenda {

	public double getValorVenda();

// Obrigatoriamente todas as classes que implementarem a IVenda , tem o metodo getValorVenda(); independente da sua
função que pode mudar de um produto para o outro .

}
/*Toda Classe pode extends apenas 1 classe Pai porém pode implementar quantas interfaces for necessario 
Agora após o Extends Produto sua classe Livro
 tem todos atributos e metodos da classe Pai,
Traduzindo ! seus Livros além de todos Atributos próprios
 ja tem precoCusto e codigo ai esta a Magica da Herança :D*/
public class Livros extends Produto implements IVenda {

	String nome; /* nome do livro */
	String autor; /* autor do livro */
	String isbn; /* isbn do livro */

	// Construtor
	public Livros(int cod, double precoCus, String n, String aut, String ISBN) {
		super(cod, precoCus); // quando voce Cria um Construtor na Classe Pai,
		// voce é obrigado a criar na classe filha
		nome = n;
		autor = aut;
		isbn = ISBN;
	}
// Get e Set
	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getAutor() {
		return autor;
	}

	public void setAutor(String autor) {
		this.autor = autor;
	}

	public String getIsbn() {
		return isbn;
	}

	public void setIsbn(String isbn) {
		this.isbn = isbn;
	}
//Método getValorVenda implementado para esta Classe especifica !
	public double getValorVenda() {
		double valorVenda = 0;
		valorVenda = getPrecoCusto() * 0.10;
		return valorVenda;

	}
}

Acho que seria basicamente isto , estude bem estes conceitos , pois é o basico da OO
e da programação em Java e qualquer linguagem que siga este padrão consequentemente :D

espero ter Ajudado

Vingdel

mausexdd, boa tarde!

A classe Produto não deveria ser abstrata?

igor972:
Galera, estou fazendo um exercício, que seria assim:

Criar a classe abstrata Produto que terá como atributos:

int codigo /* código do produto /
double precoCusto /
preço de custo do produto */
Deve ter o construtor e os métodos getters e setters.

Foi proposital você não ter declarado-a como abstract?

Abraço!

igor972

Bom Galera, não estou pedindo para ninguem fazer este exercício...Mas queria algumas dicas pra conseguir faze-lo.

Criar a classe abstrata Produto que terá como atributos:
int codigo
/* código do produto */
double precoCusto /* preço de custo do produto */
Deve ter o construtor e os métodos getters e setters.
=========================================================
Criar a interface Vendavel, que tem como método (abstrato)
getValorVenda( )
/* retorna o valor de venda do produto*/
=========================================================
Criar a classe Livro, herdeira de Produto, e que implementa a interface Vendavel, que terá os
atributos:
String nome
/* nome do livro */
String autor
/* autor do livro */
String isbn
/* isbn do livro */
Deve ter o construtor e os métodos getters e setters.
E deve implementar o método getValorVenda( ), que calcula o preço de venda como sendo o
preço de custo do livro mais 10%.
=========================================================
Criar a classe DVD, herdeira de Produto, e que implementa a interface Vendavel, que terá os
atributos:
String nome
/* nome do dvd */
String gravadora
/* nome da gravadora */
Deve ter o construtor e os métodos getters e setters.
E deve implementar o método getValorVenda( ), que calcula o preço de venda como sendo o
preço de custo do livro mais 20%.
=========================================================
Criar a classe Carrinho, que tem como atributos:
Vendavel[ ] vend;
/* array de itens vendáveis */
int quant;
/* quantidade de itens vendáveis no carrinho */
A classe Carrinho deve ter os métodos:
adicionaVendavel(Vendavel v) /* adiciona um item vendável no carrinho e incrementa quant*/
double calculaTotalVenda( )
/* calcula o total da venda dos itens do carrinho */
=========================================================
Criar a classe TestaCarrinho que terá o método main
Crie um objeto do tipo Livro e inicialize seus atributos.
Crie um objeto do tipo DVD e inicialize seus atributos.
Crie um objeto do tipo Carrinho e adicione o livro e o DVD criados.
(se preferir, crie mais objetos Livro e DVD e adicione-os ao carrinho)
Chame o método calculaTotalVenda( ) e imprima qual é o valor total das compras no carrinho.
================================================================

O que tenho até agora(Com ajuda de vocês):

Produto

package exe;

import javax.swing.JOptionPane;

public abstract class Produto{

	int codigo;
	double precoCusto;
	
	
	public Produto(int cod, double precoCus) {  
		codigo = cod;  
		precoCusto = precoCus;  
	}  


	public int getCodigo() {
		return codigo;
	}


	public void setCodigo(int codigo) {
		this.codigo = codigo;
	}


	public double getPrecoCusto() {
		return precoCusto;
	}


	public void setPrecoCusto(double precoCusto) {
		this.precoCusto = precoCusto;
	}

}
============================================= Interface Vendavel
package exe;

public interface Vendavel{

	double getValorVenda( );
	
}
=============================================//Retirei Get e sets pelo tamanho Livro
import javax.swing.JOptionPane;

 public class Livro extends Produto implements Vendavel {  
	   
	     String nome;
	     String autor;
	     String isbn;
	   
	     public Livro(int cod, double precoCus, String n, String aut, String ISBN) {  
	    	 super(cod, precoCus);  
	    	   
	    	 nome = n;  
	    	 autor = aut;  
	    	 isbn = ISBN;  
	     } 
	    	 
	     public double getValorVenda() {  
	         double valorVenda = 0;  
	         
	         valorVenda = getPrecoCusto() * 0.10;  
	         
	         return valorVenda;  
	   
	     }
	     
}
============================================= //Retirei Get e sets pelo tamanho DVD
import javax.swing.JOptionPane;

public class DVD extends Produto implements Vendavel{

	
	String nome; // nome do dvd 
	String gravadora; // nome da gravadora
	
	public DVD (int cod, double precoCus, String nom, String grav) {  
   	 super(cod, precoCus);  
   	   
   	nome = nom;  
   	gravadora = grav;  
   	 
    }
	

    public double getValorVenda() {  
        double valorVenda = 0;  
        
        valorVenda = getPrecoCusto() * 0.20;  
        
        return valorVenda;  
  
    }
    
}
=============================================

Aqui começam os problemas....

Carrinho
import javax.swing.JOptionPane;

public class Carrinho {
	Vendavel[ ] vend;
	int quant;
	
	Vendavel r = new Livro(quant, quant, null, null, null); // Criei Objeto para pegar informações do LIVRO
	Vendavel j = new DVD(quant, quant, null, null);			// Criei Objeto para pegar informações do DVD

	
	void adicionaVendavel(Vendavel v){ /* adiciona um item vendavel no carrinho e incrementa quant*/

		// Não faço ideia de como resolver isso
		
	}
	
	void calculaTotalVenda( ){	/* calcula o VALOR total da venda dos itens do carrinho */
		double total = 0;
	total = r.getValorVenda() + j.getValorVenda(); // Tentativa de calcular o valor total vendido
	
		
		JOptionPane.showMessageDialog(null,total); // testa valor recebido
	}

}
============================================= TesteCarrinho
import javax.swing.JOptionPane;

public class TesteCarrinho {

	public static void main(String[] args) {
		
		Livro a = new Livro(0, 0, null, null, null);
		DVD b = new DVD(0, 0, null, null);
		Carrinho c = new Carrinho();
		c.calculaTotalVenda();

		
	}

}

As classe que tenho duvida, são a Carrinho e Teste Carrinho.
Na classe Carrinho, criei objeto de Livro e DVD, para poder pegar suas informações de valores...mas não deu certo.... Se alguem tivem algum dica pra eu concertar, agradeço!

Vingdel

A classe Carrinho precisa de um construtor, pois você está criando uma instancia dessa classe na classe TesteCarrinho quando você faz uso do new:Carrinho c = new Carrinho();

Carrinho seria um conjunto de objetos, poderia ser um Array ou ArrayList ou LinkedList, onde iria sendo adicionado os itens.

Veja se isso da uma luz nas idéias aí…

Abraço e boa sorte!

mausexdd
//Crie um ArrayList de Produtos , melhor que um array comum , incrementa as posições dinamicamente sem ser necessário declarar no codigo
//voce Passando Produto como classe para o array indica que ele sera composto por qualquer objeto da classe Produto .e tambem nao precisara de
//uma variavel para incrementar o vetor , ele ja possui varios metodos para ler , adicionar , etc ! de uma olhada nesta classe

ArrayList<Produto> arrayProdutos = new ArrayList<Produto>();

	public void insereProduto(Produto p) {
		arrayProdutos.add(p);
	}

pense como realizar os calculos retornando todos os elementos do vetor
uma leitura até a ultima posição do vetor te retornaria todos os produtos(Objetos)deste vetor
onde voce teria acesso aos dados dos mesmos … pense nisto

Boa Sorte

mausexdd

Foi proposital você não ter declarado-a como abstract?

Abraço!

Vingdel

está correto , a classe deve ser com o modificador abstract
só queria ver se ele tinha pegado o pulo do gato o verdadeiro sentido
destes conceitos da OO

estamo ai

mausexdd

Vendavel r = new Livro(quant, quant, null, null, null); // Criei Objeto para pegar informações do LIVRO Vendavel j = new DVD(quant, quant, null, null); // Criei Objeto para pegar informações do DVD

Qual a vantagem de fazer isto, nunca intendi alguem poderia me explicar?

Quanto aos metodos de venda , da pra sai mais uma classe dai nao acha?

a Main deve manter somente as chamadas de metodos para resolver seu problema

pense nisto tbm

Criado 6 de junho de 2011
Ultima resposta 7 de jun. de 2011
Respostas 12
Participantes 5