Jump to content

[Resolvido] Como criar uma referência de uma classe abstracta


Recommended Posts

Posted

Boa tarde, sou novo aqui no fórum

Tenho uma dúvida, como é que posso criar uma referencia de uma classe abstracta.

Passo a explicar:

Tenho uma super classe que é abstracta denominada por "Item" e desta classe abstracta derivam outras mais uma das quais é a "Promotion" que ao mesmo tempo implementa uma interface "Reduction".

Na subclasse "Promotion" o meu construtor tem de ser este Promotion(Item i, int p) e é-me pedido para fazer isto:

"No construtor recebe referência i do item ao qual a promoção se aplica e a percentagem de desconto. Caso o item i seja do tipo Reduction, a percentagem de desconto é a soma da percentagem passada por parâmetro com a percentagem de i, e o item base é o item base de i."

Esta é a minha super classe abstracta Item da qual deriva Promotion

package tp2_g2;

public abstract class Item {

private String name;
protected boolean locked;

public Item(String n) {
name = n;
}

public abstract float getPrice();

public boolean sameName(String n) {
return n.equals(name);
}

public void print(String prefix) {
System.out.print(prefix + name + " -> " + getPrice());
}

}

e esta é a interface Reduction que é implementada por Promotion

package tp2_g2;

interface Reduction {

int getPercentage();

Item getItemBase();

}

e este é o código que tentei implementar em Promotion mas sem sucesso

package tp2_g2;

public class Promotion extends Item implements Reduction {

private int percentage;

public Promotion(Item i, int p) {

Item i;
i = this.i;
this.percentage = p;

if (i.getItemBase())
percentage = percentage+i;

}
...

A minha grande dúvida é como posso fazer uma referência de Item i para implementar correctamente o construtor Promotion visto que classes abstractas não são instanciáveis.

Já pesquisei pela internet sobre o problema e o que mais se fala é em Polimorfismo mas ainda não consegui tirar nenhuma conclusão concreta que me ajude a resolver o problema.

Ps: não sei se me expliquei bem durante o tópico.

Posted (edited)

não pode criar um objecto Item mas podes guardar uma referência para um Item

Item i = new Promotion();

esta parte do código não faz sentido:

public Promotion(Item i, int p) {
 Item i;
 i = this.i;

tem a entrar uma referência para um objecto to tipo Item, e depois dizes que existe uma referência dentro do scope do construtor com o nome i ....

par ao que parece que estás a fazer basta apagares isso:

public Promotion(int p) {
 super(); // não tenho a certesa que é este o comando para chamar o construtor de Item .. mas acho que sim
}

PS : estive a ver agora ... o contrutor de Item necessita de uma string : ... logo seria

public Promotion(int p) {
 super("string");
}
Edited by HappyHippyHippo
IRC : sim, é algo que ainda existe >> #p@p
Posted

No teu último trecho de código não percebo de onde vêm aqueles teus i's todos.

Como queres fazer this.i se não tens nenhuma variável de instância com esse nome?

Depois aplicas o operador + a algo do tipo Item.

E afinal que erro concreto é que te dá?

"Nós somos o que fazemos repetidamente, a excelência não é um feito, e sim, um hábito."
Não respondo a questões por PM que possam ser colocadas no fórum!

Posted

Obrigado pelas respostas tão rápido

@HappyHippyHippo, podias-me explicar porquê que o construtor de Item precisa de uma string, é verdade que tentei o que disseste e deixou de dar erro, mas não percebi porquê.

@anolsi, era um código que estava a experimentar porque tenho que implementar mais métodos nesta classe, mas já apaguei tudo pois agora a prioridade é implementar o método Promotion

Posted

Porque no código que colocaste:

public Item(String n) {
name = n;
}

“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Posted

Tu não precisas de nenhuma referência para o Item. O Promotion já é um Item. Podes perfeitamente fazer:

Item item = new Promotion(x);

“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Posted

o código que pus foi este e deixou de dar erro.

Item i = new Promotion(getItemBase(), percentage);

agora penso que basta-me só implementar o método getItemBase()

é tudo por agora, obrigado pela vossa ajuda, quando tiver o código feito ou duvidas dou noticias.

Cumprimentos

Posted (edited)

Pah... nós não ajudámos nada, visto que tu simplesmente ignoraste tudo o que dissemos...

Para que é que precisas de inicializar um Item com um Item?

Edited by KTachyon

“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Posted (edited)

Uma coisa que não me ficou clara, eu tenho de receber dois parâmetros, um deles é do "tipo" Item e o outro é inteiro. Sendo do tipo Item onde é que vou buscar esse parâmetro então?

Edited by juliovieira
Posted

Ora aí está... Aquilo que te andamos a dizer há vários posts.

O Promotion já é um Item, não precisas de enviar esse parametro para o contrutor.

“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Posted (edited)

então sugeres que fique só

public Promotion(Item i, int p) {
 percentage = p;
}

ou

public Promotion(int p) {
 percentage = p;
}

é que eu estou a insistir nisto, pois foi o que é o que diz no enunciado e diagrama de classes, e diz que tem de ser respeitado.

Edited by juliovieira
Posted (edited)

Só:

public Promotion(int p) {
percentage = p;
}

A Promotion já é um Item, não precisas de lhe enviar um Item. Até porque, como a Promotion é a única subclasse instanciável que tens da classe Item, a única forma de passares um Item para uma Promotion é criando uma Promotion, que não podes criar porque também precisas de uma Promotion para a criar... estás a ver? É um problema recursivo infinito. 🙂

Edited by KTachyon

“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Posted (edited)

Sinceramente, acho que falta algum contexto neste exercício. Basicamente, todas as classes são subclasses de Item, e é provável que aquilo que se quer com a Promotion é inserir um objecto de uma outra classe dentro da classe Promotion (pelo construtor). O getItemBase() será um getter para esse item. Logo:

class Promotion extends Item implements Reduction {
Item itemBase;

//...

public Item getItemBase() { return itemBase; }
}

Pelo menos é isso que se pode perceber pelo diagrama de classes.

No construtor não envias um Item, envias um Product, Pack ou Group (ou Promotion).

Edited by KTachyon

“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Posted

Boas, já consegui resolver o problema com a ajuda do meu stor. O construtor tem de ficar desta forma:

public Promotion(Item i, int p) {
super((i instanceof Reduction) ? ("desconto de " + (p + ((Reduction)i).getPercentage()) + "%") : ("desconto de " + p + "%"));
itemBase = i;
percentage = p;

}

tive ainda que declarar a variavel do tipo Item "itemBase"

private Item itemBase;

posso ter-me expressado mal na exposição da dúvida pois ignorei que existia uma referencia itemBase que vinha da classe Item mas de qualquer forma obrigado pela ajuda.

Cumprimentos

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.