2017-12-07 20 views
1

私はオンラインで調べていますが、私の子クラスでメソッドを呼び出す方法はまだわかりません。エグゼクティブでpay()メソッドを呼び出そうとしていますが、if文に次のコードを入力するとエラーが発生します。メソッドを呼び出そうとしたときのエラー

staff[3].awardBonus(bonus); 

このメソッドではエラーが発生します。私はそのメソッドを呼び出す方法がわかりません...どんな助けでもありがとう! `import java.util.Scanner;ここで

import java.util.Scanner; 
public class Tester 
{ 
    public static void main (String args[]) 
    {   
     Scanner scan = new Scanner(System.in); 
     StaffMember[] staff = new StaffMember[4]; 
     String internName = "Susan 2"; 
     String empName = "Tyler O."; 
     String hrName = "Becky R."; 
     String execName = "Daniel H."; 
     String address = "Brighton"; 
     String phone = "420 - 0000"; 
     String SSN = "12345789"; 
     double rate = 1000; 

     staff [0] = new Intern(internName, address, phone); 
     staff [1] = new Employee(empName, address, phone, SSN, rate); 
     staff [2] = new HourlyEmployee(hrName, address, phone, SSN, rate); 
     staff [3] = new Executive(execName, address, phone, SSN, rate); 


     for (StaffMember staffPrint : staff) 
     { 
      System.out.println (staffPrint.toString() + "\n");  
     } 

     System.out.println("If you would like to give an executive a bonus, press 1. \nIf you would like to increase the hours of an hourly employee, press 2."); 
     int input = scan.nextInt(); 
     if(input == 1) 
     { 
      double bonus = 0; 
      System.out.println("Enter the bonus for your employee: "); 
      bonus = scan.nextDouble(); 

     } 
} 

エグゼクティブクラスで、EmployeeクラスとStaffMemberクラス

public class Executive extends Employee 
{ 
    public Executive(String name, String address, String phone, String SSN, double rate) 
    { 
     super(name, address, phone, SSN, rate); 
    } 

    public double pay() 
    { 
     double money = super.pay(); 
     return money; 
    } 

    public String toString() 
    { 
     String employee = super.toString(); 
     return employee; 
    } 

    public void awardBonus(double execBonus) 
    { 
     rate += execBonus; 
    } 
} 

従業員

public class Employee extends StaffMember 
{ 
    String SSN; 
    double rate; 

    public Employee(String name, String address, String phone, String SSN, double rate) 
    { 
     super(name, address, phone); 
     this.SSN = SSN; 
     this.rate = rate; 
    } 

    public double pay() 
    { 
     return rate; 
    } 

    public String toString() 
    { 
     String employee = "";   
     employee = ("Name: " + name + "\nAddress: " + address + "\nPhone Number: " + phone + "\nSocial Security Number: " + SSN + "\nPay: " + pay());   
     return employee; 
    } 
} 

StaffMember

public abstract class StaffMember 
{ 
    String name; 
    String address; 
    String phone; 

    public StaffMember(String name, String address, String phone) 
    { 
     this.name = name; 
     this.address = address; 
     this.phone = phone; 
    } 

    public String toString() 
    { 
     String employee = "";   
     employee = ("Name: " + name + "\nAddress: " + address + "\nPhone Number: " + phone);   
     return employee; 
    } 

    public abstract double pay(); 
} 
+2

エラーとは何ですか? – notyou

+0

エラーは "シンボルを見つけることができません - メソッドawardBonus(double)" –

+1

継承と多相操作の仕組みを読んでおく必要があります。あなたは 'StaffMember []'を持っています、AFAICSは 'StaffMember'に' awardBonus'メソッドはありません。したがって、あなたはそれを呼び出すことはできません。あなたは言うかもしれませんが、私は '' Executive'を要素 '' 3 'に置き、 '' awardBonus''を呼び出しています。もしこれがコンパイルされ、 'staff [3] = new FiredStaffMember'をコード、何が起こるのでしょうか? –

答えて

1

staffはですアレイ。そこからアイテムを参照すると(staff[3]のように)、StaffMemberとなります。

StaffMemberは、方法がありませんawardBonus()です。

1

あなたの問題は、StaffMemberオブジェクトで未定義のメソッドを呼び出そうとしていることです。実際にはawardBonus()メソッドがStaffMemberクラスで定義されていませんでした。

そして、あなたはStaffMemberインスタンスとなるstaff[3]awardBonus()を呼び出すようにしようとしていたコードstaff[3].awardBonus(bonus)インチ

1

すべてのStaffMembersにawardBonusを指定すると、StaffMemberで呼び出すことができます。例えば:

public abstract class StaffMember 
{ 
    public void awardBonus(double bonus) { 
     if (bonus > 0) { 
      throw new IllegalStateException("Only executives receive a bonus"); 
     } 
    } 
... 

public class Executive extends StaffMember 
{ 
    @Override 
    public void awardBonus(double bonus) { 

P.S.これについて会社に知らせるように注意してください。

+1

'StaffMember'に' abstract'' awardBonus'メソッドが含まれていれば、より良いと思います。 –

+0

@ThomasBöhmしかし、その後エグゼクティブ関連の関数をどこにでも実装しなければなりません、デフォルトの非動作の代わりに。しかし、はい、一つは考慮する必要があります。 –

0

あなたは使用することができます。

// Check if staff[3] is really an Executive 
if(staff[3] instanceof Executive) { 
    // Cast staff[3] to an Executive 
    Executive executive = ((Executive)staff[3]); 
    // Now you can call awardBonus 
    executive.awardBonus(bonus); 
} 

staffはMethodeのawardBonusが含まれていませんStaffMemberアレイですので。
staff[3]Executiveですが、ご使用のプログラムでは認識されません。したがってstaff[3]がでExecutiveに安全にキャストできるように、エグゼクティブのインスタンスであるかどうかを確認する必要があります。

関連する問題