Dúvida em chamadas polimórficas

7 respostas
ribclauport

Fazendo o mock, me deparei com uma dúvida se uma chamada é ou não polimórfica, pois a resposta do mock diz que sim, e eu acho que é de se questionar

veja a questão, as respostas, e por fim minha dúvida:

Questão:

Consider the following classes :

class A{ 
   public void mA(){ };
}

class B extends A { 
   public void mA(){ }
   public void mB() { }
}

class C extends B { 
   public void mC(){ }
}

and the following declarations:

A x = new B(); B y = new B(); B z = new C();

Which of the following calls are polymorphic calls?

Respostas:

a)x.mA(); -->polimorfica
b)x.mB();
c)y.mA();-->polimorfica
d)z.mC();
e)z.mB();-->polimorfica

Dúvida:
B y = new B(), aqui existe uma variável do tipo b, e a mesma na opção c, esta fazendo chamada a um método sobrescrito, ou seja, não está havendo uma escolha em tempo de execução de qual "versão" do método será chamado, já que a referência não é do tipo "A", desta forma a pergunta é:

chamada de um método sobrescrito na variável de referência "x" é sempre considerada uma chamada polimórfica?

Espero ter conseguido transmitir a minha dúvida.

7 Respostas

Henrique.tenorio

Regra básica do polimorfismo:
O polimorfismo ocorre quando um programa invoca um método usando uma variável de superclasse, em tempo de execução a versão de subclasse do método é invocada baseado no tipo de referencia armazenada na variável de superclasse.

Resp: Agora Eu acredito que Talvez.

ribclauport

Henrique, a dúvida é justamente essa, pois na alternativa, está referenciando a variável y, veja abaixo que y é do tipo B.

B y = new B();

class B extends A {   
   public void mA(){ }  
   public void mB() { }  
}

c)y.mA();–>polimorfica

Ou seja, a variável de referência é do tipo B.

Seguindo sua afirmação, a variável não é da super classe, e apenas esta havendo a chamado de um método sobrescrito, mas que neste caso não está sendo chamado com a variável de referência da super classe. Penso que a resposta está errada.

Andersonrms

Na minha opinião apenas a alternativa “a” está correta. Agora, se o mock diz outra coisa, fica a dúvida.

Henrique.tenorio

Não existe polimorfismo ai não ! se existir, vou voltar a programar com visualg. T+

ribclauport

Explicação do mock

A Polymorphic call means that irrespective of the type of the variable, the method of the actual class of the object refered by the variable is invoked. In java, all non-private method calls are polymorphic because which method is invoked is decided at runtime instead of compile time.

In this case, x.mB() is invalid call. It will not even compile because the class of x is A, which does not contain method mB(). Even though the object refered to by x is of class B which does contain mB(). z.mC() is invalid for the same reason.

Esta afirmação do mock realmente, me deixou bem confuso veja:

In java, all non-private method calls are polymorphic because which method is invoked is decided at runtime instead of compile time.

Ele afirma que toda chamada em java de métodos não privados são polimórficas!

Aff… sei lá.

Henrique.tenorio

Espera um pouco, vou telefonar lá para a Oracle pra ver qual é a resposta deles, cara isso ai não pode estar certo não.

ribclauport

Dei um print para vocês verem da tela do mock da enthuware, comprovando o citado no post, marquei as corretas segundo o corretor do mock, para o avaliador dar a resposta


Criado 21 de março de 2012
Ultima resposta 22 de mar. de 2012
Respostas 7
Participantes 3