私はJavaの本を読んでおり、現在Polymorphism
のトピックと、downcast
のリファレンス変数についての本を読んでいます。しかし、私はかなりダウンキャスティングのコンセプトを理解することに固執しています。以下は私が従う例のumlです。彼らは彼らの基本給に与えられた10%の増加にあるBasePlusCommissionEmployee
のすべてのオブジェクトのために多態性とダウンキャスティングの質問
。他のEmployee
サブクラスは通常通りです。 PayrollSystemTest
には、アプリケーションを実行する主な方法が含まれています。
// Fig. 10.9: PayrollSystemTest.java
// Employee hierarchy test program.
public class PayrollSystemTest
{
public static void main(String[] args)
{
// create subclass objects
SalariedEmployee salariedEmployee =
new SalariedEmployee("John", "Smith", "111-11-1111", 800.00);
HourlyEmployee hourlyEmployee =
new HourlyEmployee("Karen", "Price", "222-22-2222", 16.75, 40.0);
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("Employee processed individually:");
System.out.printf("%n%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());
// create four-element Employee array
Employee[] employees = new Employee[4];
// initialize array with Employees
employees[0] = salariedEmployee;
employees[1] = hourlyEmployee;
employees[2] = commissionEmployee;
employees[3] = basePlusCommissionEmployee;
System.out.printf("Employees processed polymorphically:%n%n");
// generically process each element in array employees
for (Employee currentEmployee : employees)
{
System.out.println(currentEmployee); // invokes toString
// determine whether element is a BasePlusCommissionEmployee
if (currentEmployee instanceof BasePlusCommissionEmployee)
{
// downcast Employee reference to
// BasePlusCommissionEmployee reference
BasePlusCommissionEmployee employee =
(BasePlusCommissionEmployee) currentEmployee;
employee.setBaseSalary(1.10 * employee.getBaseSalary());
System.out.printf(
"new base salary with 10%% increase is: $%,.2f%n",
employee.getBaseSalary());
} // end if
System.out.printf(
"earned $%,.2f%n%n", currentEmployee.earnings());
} // end for
// get type name of each object in employees array
for (int j = 0; j < employees.length; j++)
System.out.printf("Employee %d is a %s%n", j,
employees[j].getClass().getName());
} // end main
} // end class PayrollSystemTest
本はさらに、ループ反復配列employees
ための拡張および方法toString
及び各反復におけるアレイ内の異なるEmployee
への参照を割り当てられEmployee
可変currentEmployee
とearnings
を起動することを説明しています。その結果、出力は、各クラスの特定のメソッドが呼び出され、実行時にオブジェクトのタイプに基づいて解決されることを示しています。現在Employee
オブジェクト上BasePlusCommissionEmployee
年代方法getBaseSalary
とsetBaseSalary
を呼び出すために、条件ステートメントは、オブジェクト参照がのinstanceof演算子を使用して、条件が真である場合BasePlusCommissionEmployee
オブジェクトであるかどうかをチェックするために使用される
上記のメソッドを呼び出す前に、オブジェクトはダウンタイプからEmployee
〜BasePlusCommissionEmployee
になる必要があります。
これは真剣に、我々は、サブクラスtoString
メソッドにアクセスすることができますので、私を混乱させるが、他の方法、すなわちgetBaseSalary
とsetBaseSalary
を使用するためにオブジェクトをダウンキャストする必要がありますか?これはなぜですか?
うんは、私にはあまり意味があります。ところで、どうしてinstanceofの使用は悪い習慣だと言いますか? – Scorpiorian83
instanceofは通常、ポリモーフィズムを適用するコードで置き換えられるため、悪い習慣です。 GhostCatの答えを参照してください。別の言い方をすると、コード 'if(obj instanceof ClassA){doA(); } else if(クラスBのobjインスタンス){doB();} } 'はClassAとClassBのスーパークラスで' doStuff() 'メソッドを定義し、それぞれのクラスでオーバーライドして正しいことを行い、上記のコードを' obj.doStuff() 'に置き換えることによって、より良く書かれます。 –