Dúvidas - Poliomorfismo

1 resposta
L

Estou com uma série de dúvidas sobre o assunto , grande parte eu achei a resposta no google o restante delas postarei aki.
Neste exercício são usadas as seguintes classes

SalariedEmployee é um Employee , HourlyEmployee é um Employee
BasePlusCommissionEmployee é um CommissionEmployee é um Employee

Vo colar a classe Employe e a classe Princiapl;

// Fig. 10.4: Employee.java
// Superclasse abstrata Employee.

public abstract class Employee
{
   private String firstName;
   private String lastName;
   private String socialSecurityNumber;

   // construtor com três argumentos
   public Employee( String first, String last, String ssn )
   {
      firstName = first;
      lastName = last;
      socialSecurityNumber = ssn;
   } // fim do construtor Employee com três argumentos

   // configura o nome 
   public void setFirstName( String first )
   {
      firstName = first;
   } // fim do método setFirstName 

   // retorna o nome
   public String getFirstName()
   {
      return firstName;
   } // fim do método getFirstName

   // configura o sobrenome 
   public void setLastName( String last )
   {
      lastName = last;
   } // fim do método setLastName 

   // retorna o sobrenome
   public String getLastName()
   {
      return lastName;
   } // fim do método getLastName

   // configura o CIC 
   public void setSocialSecurityNumber( String ssn )
   {
      socialSecurityNumber = ssn; // deve validar
   } // fim do método setSocialSecurityNumber

   // retorna o CIC
   public String getSocialSecurityNumber()
   {
      return socialSecurityNumber;
   } // fim do método getSocialSecurityNumber 

   // retorna a representação de String do objeto Employee
   public String toString()
   {
      return String.format( "%s %s\nsocial security number: %s", 
         getFirstName(), getLastName(), getSocialSecurityNumber() );
   } // fim do método toString

   // método abstrato sobrescrito pelas subclasses                 
   public abstract double earnings(); // nenhuma implementação aqui
} // fim da classe abstrata Employee






// Fig. 10.9: PayrollSystemTest.java
// Programa de teste da hierarquia Employee.

public class PayrollSystemTest 
{
   public static void main( String args[] ) 
   {
      // cria objetos de subclasse                                           
      SalariedEmployee salariedEmployee =                                 
         new SalariedEmployee( "John", "Smith", "111-11-1111", 800.00 );  
      HourlyEmployee hourlyEmployee =                                     
         new HourlyEmployee( "Karen", "Price", "222-22-2222", 16.75, 40 );
      CommissionEmployee commissionEmployee =                             
         new CommissionEmployee(                                          
         "Sue", "Jones", "333-33-3333", 10000, .06 );                     
      BasePlusCommissionEmployee basePlusCommissionEmployee =             
         new BasePlusCommissionEmployee(                                  
         "Bob", "Lewis", "444-44-4444", 5000, .04, 300 );                 

      System.out.println( "Employees processed individually:\n" );

      System.out.printf( "%s\n%s: $%,.2f\n\n", 
         salariedEmployee, "earned", salariedEmployee.earnings() );
      System.out.printf( "%s\n%s: $%,.2f\n\n",
         hourlyEmployee, "earned", hourlyEmployee.earnings() );
      System.out.printf( "%s\n%s: $%,.2f\n\n",
         commissionEmployee, "earned", commissionEmployee.earnings() );
      System.out.printf( "%s\n%s: $%,.2f\n\n", 
         basePlusCommissionEmployee, 
         "earned", basePlusCommissionEmployee.earnings() );

      // cria um array Employee de quatro elementos
      Employee employees[] = new Employee[ 4 ];

      // inicializa o array com Employees          
      employees[ 0 ] = salariedEmployee;          
      employees[ 1 ] = hourlyEmployee;            
      employees[ 2 ] = commissionEmployee;        
      employees[ 3 ] = basePlusCommissionEmployee;

      System.out.println( "Employees processed polymorphically:\n" );

      // processa genericamente cada elemento no employees
      for ( Employee currentEmployee : employees ) 
      {
         System.out.println(currentEmployee); // invoca toString

         // determina se elemento é um BasePlusCommissionEmployee
         if (currentEmployee instanceof BasePlusCommissionEmployee) 
         {
            // downcast da referência de Employee para
            // referência a BasePlusCommissionEmployee
            BasePlusCommissionEmployee employee = 
                ( BasePlusCommissionEmployee ) currentEmployee;

            double oldBaseSalary = employee.getBaseSalary();
            employee.setBaseSalary( 1.10 * oldBaseSalary );
            System.out.printf( 
               "new base salary with 10%% increase is: $%,.2f\n",
               employee.getBaseSalary() );
         } // fim do if

         System.out.printf( 
            "earned $%,.2f\n\n", currentEmployee.earnings());
      } // for final

      // obtém o nome do tipo de cada objeto no array employees
      for ( int j = 0; j < employees.length; j++ )      
         System.out.printf( "Employee %d is a %s\n", j,
            employees[ j ].getClass().getName() );      
   } // fim de main
} // fim da classe PayrollSystemTest

Dúvidas :
1-Pq q nessa classe principal qnd o método ToString vai ser chamado não é necessário usar por ex. HourlyEmployee.ToString ?Neste exemplo eles chamam o método apenas usando o ponteiro do array, as como o prog sabe que é pra chamar o método ToString e não outro ?

2-Q q acontece neste trecho ?

BasePlusCommissionEmployee employee =
( BasePlusCommissionEmployee ) currentEmployee;

Iste é um downcast , certo ? Mas o q seria um downcast, qual a sua função?

[color="red"]* Editado: Lembre-se de utilizar BBCode em seus códigos - Jair Elton :joia: [/color]

1 Resposta

J

Porque na variavel tem um objeto de um determinado tipo, ele simplesmente chama o metodo toString(), seja lá qual for o objeto… se você precisasse especificar que objeto é, não seria polimorfismo.

2-Q q acontece neste trecho ?

BasePlusCommissionEmployee employee =
( BasePlusCommissionEmployee ) currentEmployee;

Iste é um downcast , certo ? Mas o q seria um downcast, qual a sua função?

Você está convertendo o tipo da variavel, referencia, não o objeto, para um outro tipo compativel… está pegando uma referencia generica e transformando em uma mais especifica, para que você possa ter acesso aos membros especificos de BasePlusCommissionEmployee, já que a referencia original só dá acesso aos metodos da classe Employee, isso só é possivel se o objeto armazenado na variavel for realmente um BasePlusCommissionEmployee, se não, vai lançar uma exceção ClassCastException

Criado 29 de outubro de 2006
Ultima resposta 29 de out. de 2006
Respostas 1
Participantes 2