juliovieira Posted May 17, 2012 at 03:53 PM Report #456435 Posted May 17, 2012 at 03:53 PM 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.
HappyHippyHippo Posted May 17, 2012 at 03:59 PM Report #456440 Posted May 17, 2012 at 03:59 PM (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 May 17, 2012 at 04:01 PM by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
anolsi Posted May 17, 2012 at 04:03 PM Report #456441 Posted May 17, 2012 at 04:03 PM 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!
juliovieira Posted May 17, 2012 at 04:13 PM Author Report #456448 Posted May 17, 2012 at 04:13 PM 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
KTachyon Posted May 17, 2012 at 04:17 PM Report #456450 Posted May 17, 2012 at 04:17 PM 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
juliovieira Posted May 17, 2012 at 04:19 PM Author Report #456451 Posted May 17, 2012 at 04:19 PM (edited) Porque no código que colocaste: public Item(String n) { name = n; } isso é a referencia ao Item i que vou receber como parâmetro? Edited May 17, 2012 at 04:19 PM by juliovieira
KTachyon Posted May 17, 2012 at 04:24 PM Report #456455 Posted May 17, 2012 at 04:24 PM 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
juliovieira Posted May 17, 2012 at 04:55 PM Author Report #456464 Posted May 17, 2012 at 04:55 PM 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
KTachyon Posted May 17, 2012 at 05:05 PM Report #456469 Posted May 17, 2012 at 05:05 PM (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 May 17, 2012 at 05:05 PM 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
juliovieira Posted May 17, 2012 at 05:15 PM Author Report #456472 Posted May 17, 2012 at 05:15 PM (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 May 17, 2012 at 05:17 PM by juliovieira
KTachyon Posted May 17, 2012 at 05:27 PM Report #456475 Posted May 17, 2012 at 05:27 PM 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
juliovieira Posted May 17, 2012 at 05:58 PM Author Report #456484 Posted May 17, 2012 at 05:58 PM (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 May 17, 2012 at 06:01 PM by juliovieira
HappyHippyHippo Posted May 17, 2012 at 06:12 PM Report #456489 Posted May 17, 2012 at 06:12 PM tenho um "felling" que Promotion não deriva de Item .... IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
KTachyon Posted May 17, 2012 at 06:13 PM Report #456491 Posted May 17, 2012 at 06:13 PM (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 May 17, 2012 at 06:13 PM 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
juliovieira Posted May 17, 2012 at 06:19 PM Author Report #456495 Posted May 17, 2012 at 06:19 PM (edited) aqui está o diagrama de classes, é por aí que me estou a seguir http://img526.imageshack.us/img526/7156/diagramadeclasses.png Edited May 17, 2012 at 06:20 PM by juliovieira
KTachyon Posted May 17, 2012 at 06:35 PM Report #456500 Posted May 17, 2012 at 06:35 PM (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 May 17, 2012 at 06:36 PM 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
juliovieira Posted May 21, 2012 at 03:12 PM Author Report #457173 Posted May 21, 2012 at 03:12 PM 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
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now