我有两个类,它们是抽象类的子类A:
class X extends A {}
class Y extends A {}
Run Code Online (Sandbox Code Playgroud)
我想识别A传递给函数的对象的子类.我可以看到两种选择:
void myfunction(A myobj) {
if(myobj instanceof X)
doXStuff((X) myobj);
if(myobj instanceof Y)
doYStuff((Y) myobj);
}
Run Code Online (Sandbox Code Playgroud)
或添加不同类型的enumto A:
abstract class A {
enum Type { X, Y };
Type type;
...
}
class X extends A {
type = Type.X;
...
}
class Y extends A {
type = Type.Y;
...
}
void myfunction(A myobj) {
if(myobj.type == Type.X)
doXStuff((X) myobj);
if(myobj.type == Type.Y)
doYStuff((Y) myobj);
}
Run Code Online (Sandbox Code Playgroud)
哪个更好?我倾向于第二,因为instanceof生产应用感觉不对.还有另一个最好的方法吗?如果第二个更好,有没有更好的地方放enum?
两者都很糟糕.
定义方法A,重写方法,X并Y在传入的对象上调用该方法.你抛弃了多态,这是面向对象编程的基石.
abstract class A {
void doStuff();
}
class Y extends A {
@Override
void doStuff() {
// Y specific implementation
}
}
class X extends A {
@Override
void doStuff() {
// X specific implementation
}
}
Run Code Online (Sandbox Code Playgroud)
用它来称呼它
void myfunction(A myobj) {
myobj.doStuff();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
569 次 |
| 最近记录: |