ikb*_*bal 46 java oop polymorphism inheritance instanceof
我有一个课程Child延伸Parent.
Parent child = new Child();
if (child instanceof Parent){
// Do something
}
Run Code Online (Sandbox Code Playgroud)
这会返回true还是false,为什么?
Oza*_*ray 58
是的,它会的.为什么不呢?
因为孩子实际上是父母的一个实例.如果,您只想为孩子执行操作,则应检查
if (child instanceof Child){
}
Run Code Online (Sandbox Code Playgroud)
但是你应该记住Scott Meyers的Effective C++中的以下声明:
"任何时候你发现自己编写表单的代码"如果对象是T1类型,那么做一些事情,但如果它是T2类型,那么做其他事情,"打自己.
我认为也适用于这种情况.如果您想根据引用对象所属的类类型来执行某些操作,则以下代码结构应该可以帮助您.
注意:我没有编译它.
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();
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:一个更好的例子
您可以开发绘图应用程序.绘制任何形状的应用程序.在这种情况下,您应该有一个抽象类型Shape.
出于某些目的; 绘制所有形状; 列出所有形状; 找到一个形状或删除一个形状,你需要有一个形状列表.由于列表是父类型,因此它可以存储任何形状.
该Shape 接口/抽象类/虚拟类应该有一个抽象/纯虚函数Draw().所以,在你的DrawToDeviceLoop中,你只需要调用Draw()每个形状,你永远不需要检查它是什么形状.
该Shape接口可以具有抽象实现AbstractShape,其可以具有形状名称或id作为数据成员以及GetName,Cleanup和具有所有形状共有功能的其他功能.
请记住,抽象类型无法实例化,因此Shape无法实例化,因为它也无法绘制.
| 归档时间: |
|
| 查看次数: |
42281 次 |
| 最近记录: |