在基类中提供检查实例类型是一种好的做法吗

Is it a good practice to provide check the instance type in the base class

本文关键字:一种 基类 检查 类型 实例      更新时间:2023-10-16

我有四个类。A、 B、D是派生类,C是基类。如果给定的实例是A或D,则返回true;否则,返回false。以下是我的代码:

 //A.java
 public class A extends C{
 }
 //B.java 
 public class B extends C {
 }
 //D.java
 public class D extends C {
 }
 //C.java
 public class C {
     public boolean isSupported(C object){
         boolean result= false;
         // Object type check
         if(object instanceof A || object instanceof D){ // A, D
            result=true;
          }
          else {  // B, C
            result=false;
          }
       return result;
    }
    public static void main(String args[]){
        C tmp = new A();
        System.out.println(tmp.isSupported());
     }
 }

那么,在基类C的isSupported()中检查实例/对象类型是一种好的做法吗?(对于C++,如果在不同的文件中定义了四个类,如果我这样做,我必须在提供类C实现的文件中包括定义类A和D的头文件,这有点奇怪)。

我知道我可以在每个派生类中提供一个重写函数。但是它是不是有点重复代码,尤其是如果我有很多派生类的话。

有人能给我一些建议吗?

感谢

您应该重写子类中的isSupported,以便AD重写它以返回trueC定义默认行为(返回false),BC继承该默认行为而不重写。

public class C {
    public boolean isSupported() {
        return false;
    }
}
public class A extends C {
    @Override
    public boolean isSupported() {
        return true;
    }
}
public class B extends C {
    // inherits isSupported from C
}
public class D extends C {
    @Override
    public boolean isSupported() {
        return true;
    }
}

基类永远不应该知道任何关于扩展它的类的信息。否则,在扩展基类时需要修改基类。我认为这种风格非常糟糕(换句话说,它"有气味"-不,这不是侮辱-请参阅"代码气味")。

你为什么要这么做?

相关文章: