Probleminhas com OO

7 respostas
G

Pessoal, alguem pode me explicar pq isso não funciona??

public abstract class ClassePai {

protected abstract Object doStuff(ClassePai pai);

}

public class ClasseFilho extends ClassePai {
private Object doStuff(ClasseFilho filho) {

}
}

Neste caso, pq não estou implementando o método doStuff se ClasseFilho eh um ClassePai??

7 Respostas

H

bom…sou iniciante , mas eu acho que::

na subclasse vc definiu o metodo como private e na superclasse esta protected

tb a assinatura na subclasse é ClasseFilho nomevariavel e na superclasse é ClassePai

C

Não funciona por vários motivos:

1- Se tiver declarado no mesmo arquivo então não pode ter duas classes como public;

2- O método private Object doStuff(ClasseFilho filho) não retorna nada;

3- A classe ClasseFilho é filha da classe ClassePai, porém a classe ClasseFilho não implementa o método protected abstract Object doStuff(ClassePai pai), logo deveria ser abstrata.

O código pra fazer isso funcionar seria:

public abstract class ClassePai { 
  protected abstract Object doStuff(ClassePai pai); 
} 

class ClasseFilho extends ClassePai { 
  private Object doStuff(ClasseFilho filho) { 
    return null;
  } 
  protected Object doStuff(ClassePai pai){
    return null;
  }
}

Agora sim, as duas classes se estiverem no mesmo arquivo não são mais públicas (só uma delas), o método doStuff tá retornando alguma coisa (null) e vc tá sobrescrevendo o doStuff da classe pai, como você mesmo disse, você não estava implementado o método doStuff da ClassePai e a sua classe não era abistrata.

Um outro jeito de fazer funcionar é colocando o modificar abstract na segunda classe:

public abstract class ClassePai { 
  protected abstract Object doStuff(ClassePai pai); 
} 

abstract class ClasseFilho extends ClassePai { 
  private Object doStuff(ClasseFilho filho) { 
    return null;
  } 
}

[]'s
carisio

G

ée pessoal, na verdade foi exatamente isso que eu fiz, eh q coloquei de forma resumida aqui e vcs acabaram nao entendendo…

public abstract class ClassePai { 
  protected abstract Object doStuff(ClassePai pai); 
} 

public abstract class ClasseFilho extends ClassePai { 
  protected Object doStuff(ClasseFilho filho) { 
    return null; 
  } 
}

Cada classe está em seu respectivo arquivo .java.

 que o WebSphere acusa q a classe ClasseFilho não está implementando o método doStuff da classe pai, entende??

Tipo, se eu colocar:

protected Object doStuff(ClassePai filho) {

return null;

}

Ai ele funciona, mas se ClasseFilho eh um ClassePai pq isso nao funciona?? Isso q eu nao entendo!!
H

não funciona pq vc declarou um metodo p/ a subclasse e não reescreveu o metoda da superclasse…a assinatura deve ser a mesma p/ as classes:
doStuff(ClassePai pai); doStuff(ClassePai filho)

a classe filha herda o metodo definido na classe mae… como vc modificou a assinatura na classe filha, o metodo se refere só a classe filha…
espero estar certo, se eu disse bobagem, os mais entendidos explicam melhor

G

Eh, ai funciona, eh que eu só não entendi pq que nesse caso eu estou modificando a assinatura se ClasseFilho é um ClassePai entende?? Acho q deveria funcionar!!

P

Estude sobrecarga de métodos.

M

Por que para você implementar o método abstrato as classes declaradas no parâmetro tem de ser idênticas, pq apesar de haver um relacionamento entre elas, ClassePai e ClasseFilho não são iguais. Nesse caso em que você colocou classes diferentes você não está sobrescrevendo(implementando) o método e sim está apenas sobrecarregando ele.

Por isso quando você altera o tipo da referência ele passa a funcionar.

Imagine se você colocar um método na classe Object com um nome muito comum e no parâmetro colocasse também uma referência à object. Qualquer método que tivesse esse mesmo nome e passase um objeto no parâmetro estaria sobrescrevendo este método de Object. Acho que por isso que apesar das classes terem um relacionamento elas tem de ser iguais para haver sobrescrita.

Criado 10 de maio de 2005
Ultima resposta 10 de mai. de 2005
Respostas 7
Participantes 5