1

私は3つのクラスを持っており、最初は人です:

public class Person {    
    Person() {

    }
}

2番目は人を拡張するエンジニアです

public class Engineer extends Person { 
    Engineer() {

    } 
}

と別の人の拡張

public class Doctor extends Person {
    Doctor() {

    } 
}

最後は、コンストラクターにオブジェクトPersonを取り込む作業です。

public class Work {
    Work(Person p) {
    //how to insure that p is Engineer ?
    }
}

オブジェクトpがEngeneerであり、別のクラスからのものではないことを検出するにはどうすればよいですか?

4

7 に答える 7

6

このキーワードを使用してinstanceof、オブジェクトのタイプを確認できます。それはこのように動作します

if(p instanceof Engineer) {
   // do Engineer stuff
} else {
   // not an Engineer object
}
于 2012-05-03T07:57:23.570 に答える
2

次の方法で確認できます。

if (p instanceof Engineer)

また

if (p.getClass() == Engineer.class)
于 2012-05-03T07:57:55.847 に答える
1

次のようなものを使用します:

if (p.getClass() == Engineer.class) {
    //Is engineer
}
于 2012-05-03T07:57:13.050 に答える
1
public class Work {

    // ensure only Engineer can pass in
    Work(Engineer p) {

    }
}

またはinstanceofキーワードを使用する

演算子はinstanceof、オブジェクトを指定されたタイプと比較します。これを使用して、オブジェクトがクラスのインスタンス、サブクラスのインスタンス、または特定のインターフェイスを実装するクラスのインスタンスであるかどうかをテストできます。

public class Work {

    Work(Person p) {
        // make sure p is type of Engineer
        if(p instanceof Engineer) {
            // dowork
            Engineer e = (Engineer) p;
        } else {
            // not engineer or p is null
        }
    }
}
于 2012-05-03T07:57:21.070 に答える
1
p.getClass() 

(そしてそこから、.getName()

またはオペレーターinstanceof(注:医師とエンジニアはinstanceOf Persontrueとして返されます。より具体的なクラスを確認してください)

于 2012-05-03T07:57:54.063 に答える
1

これを行う必要はありません。

Work(Engineer p) {
    // p is an Engineer
}

また

Work(Person p) {
    p.doWork(); // calls the appropriate work methopd for any person.
}
于 2012-05-03T07:58:13.860 に答える
1

次のようなinstanceofキーワードを使用します

if(p instanceof Engineer) {
    // do something
}

if(p instanceof Doctor) {
    // do something
}

しかし、これは正しい方法ではありません。エンジニアのクラスではエンジニアの行動(メソッド)を、ドクターのクラスではドクターの行動をとる必要があります。

Peterの答えを参照してください。ランタイムポリモーフィズムは、どのメソッドを自動的に呼び出すかを検出します。

すなわち

class Engineer extends Person {
    // properties
    // methods
    public void doWork() {
        // does engineering work
    }
}

class Doctor extends Person {
    // properties
    // methods
    public void doWork() {
        // does doctor work like check patients, operation or other his task
    }
}

class Work {
    Work(Person p) {
        p.doWork(); // if you pass engineer obj here, Engineer.doWork() is called. And if you pass doctor, Doctor.doWork() is called.
        // You don't need to use instanceof.
    }
}

上記の場合、EngineerとDoctorのメソッド名は同じですが、instanceofを使用する必要がある場合があります。たとえば、DoctorにはcheckPatient()メソッドがあり、EngineerにはdesignEngine()のような異なるメソッド名があり、instanceofを使用する必要があります。 。

于 2012-05-03T07:58:33.227 に答える