Child
を拡張するクラスParent
があります。
Parent child = new Child();
if (child instanceof Parent){
// Do something
}
これはtrueまたはfalseを返しますか?なぜですか?
はい 、そうでしょう。そして、なぜそうすべきではないのでしょうか?
子は実際には親のインスタンスだからです。子に対してのみ操作を実行する場合は、確認する必要があります
_if (child instanceof Child){
}
_
ただし、Scott MeyersによるEffective C++の次のステートメントを覚えておく必要があります。
「オブジェクトのタイプがT1の場合は何かを実行しますが、T2のタイプの場合は何か他の処理を実行します」という形式のコードを記述している場合があります。
この場合にも当てはまると思います。参照されているオブジェクトがどのクラスのクラスに属しているかに基づいてdoSomethingを行いたい場合は、次のコード構造が役立ちます。
注:コンパイルしていません。
_class Parent {
public void doSomething() {
System.out.println("I am the Parent, and I do as I like");
}
}
class ChildA extends Parent {
public void doSomething() {
System.out.println("I am a child named A, but I have my own ways, different from Parent");
}
}
class ChildB extends Parent {
public void doSomething() {
System.out.println("I am a child named B, but I have my own ways, different from my Parent and my siblings");
}
}
public class Polymorphism101 {
public static void main(String[] args) {
Parent p = new Parent();
p.doSomething();
p = new ChildA();
p.doSomething();
p = new ChildB();
p.doSomething();
}
}
_
編集:より良い例
drawingアプリケーションを開発している可能性があります。あらゆる種類の図形を描画するアプリケーション。その場合、abstractタイプShape
が必要です。
目的のために;すべての図形の描画。すべての形状をリストします。シェイプを見つけるか、シェイプを削除するには、シェイプのlistが必要です。リストは親タイプであるため、任意の形状を保存できます。
Shape
interface/abstract class/virtual classには、abstract/pure virtualfunction Draw()
。したがって、DrawToDeviceLoopでは、各形状に対してDraw()
を呼び出すだけで、形状を確認する必要はありません。
Shape
インターフェイスには、abstract実装AbstractShape
を含めることができます。これは、データメンバーとして形状名またはIDを、GetName、Cleanup、およびその他の関数として使用できますすべての形状に共通の機能。
抽象型はインスタンス化できないことを思い出してください。したがって、Shape
自体もインスタンス化できません。
instanceofは、サブクラスであればtrueを返します...