我们如何避免使用instanceof
运算符来编写干净的代码
比如说:
如果一个对象是Type1做某事,但如果它是Type2,那么做其他事情。
if(obj instanceof T1){
doSomething()
}else(obj instanceof T2){
doOtherThing()
}
答案 0 :(得分:2)
通常,您使用一系列带有强制转换的instanceof
来调用类中存在但不存在于其他类中的特定方法:
if(obj instanceof T1){
((T1)obj) doSomething();
}
else(obj instanceof T2){
((T2)obj) doOtherThing();
}
为避免这种情况,如果您可以修改这些类,T1
和T2
应该是公共基类的子类,并且应该在基类中定义调用的方法。
通过这种方式,每个子类都可以实现它,你可以写:
obj.doSomething();
如果你不能修改这些类,你总是可以引入一个Adapter
类来包装它们,以提供一种调用这些方法的常用方法。
<强>适配器强>
public interface Adapter{
void process();
}
<强> AdapterForT1 强>
public class AdapterForT1 implements MyAdapter{
private T1 adapted;
public AdapterForT1(T1 adapted){
this.adapted = adapted;
}
public void process(){
adapted.doSomething();
}
}
<强> AdapterForT2 强>
public class AdapterForT2 implements MyAdapter{
private T2 adapted;
public AdapterForT2(T2 adapted){
this.adapted = adapted;
}
public void process(){
adapted.doOtherThing();
}
}
你可以这样使用它们:
MyAdapter adapter = new AdapterForT1(obj);
...
adapter.process();
或:
MyAdapter adapter = new AdapterForT2(obj);
...
adapter.process();
答案 1 :(得分:1)
你需要在这里使用方法覆盖,然后从不同类的不同实例中调用相同的函数,这些实例将执行不同的指令集,这些指令按照在各个类中实现
例如,你有一个类T,然后类T1和类T2都扩展了类T,所有三个类都实现了executeTask函数
所以,
T t1 = new T1();
T t2 = new T2();
// this will execute function overridden in T1
t1.executeTask();
// this will execute function overridden in T2
t2.executeTask();
答案 2 :(得分:1)
创建一个String^ s = String::Format("{0:N2}", temperature/204.6);
,两个类都实现。接口是每个实现类必须遵守的合同。
通过这种方式,您可以确保此类的每个实例都具有从该接口实现的所有已定义方法。
例如:
interface
然后你的两个班级:
public interface CustomExecutable {
void execute();
}
在您的主程序中,您可以执行以下操作:
public class T1 implements CustomExecutable {
@Override
public void execute() {
// Do t1 logic
}
}
public class T2 implements CustomExecutable {
@Override
public void execute() {
// Do t2 logic
}
}
不再需要 CustomExecutable ce = new T1();
ce.execute(); // Does t1 logic
ce = new T2();
ce.execute(); // Does t2 logic
,因为每种类型都有自己instanceof
代码的方式。