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

Java 在基类中提供实例类型检查是一种好的做法吗,java,c++,Java,C++,我有四节课。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 o

我有四节课。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++,如果在不同的文件中定义了四个类,如果我这样做,我必须在文件中定义类A和D的头文件,提供C类的实现,这有点奇怪。” 我知道我可以在每个派生类中提供重写函数。但是它是一种重复的代码,特别是如果我有很多派生类的话

谁能给我一些建议吗


谢谢

基类永远不需要知道任何关于类扩展它的知识。否则,在扩展基类时需要修改它。我会认为这是非常糟糕的风格(换句话说,它是气味)-不,那不是侮辱-见“”。p>
为什么需要这样做?

基类永远不需要知道有关扩展它的类的任何信息。否则,在扩展基类时需要修改它。我会认为这是非常糟糕的风格(换句话说,它是气味)-不,那不是侮辱-见“”。p>
为什么需要这样做?

您应该重写子类中的
isSupported
,以便
A
D
重写它以返回
true
C
定义默认行为(返回
false
)而
B
C
继承默认行为而不重写

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;
    }
}

您应该重写子类中的
isSupported
,以便
A
D
重写它以返回
true
C
定义默认行为(返回
false
),并且
B
C
继承默认行为而不重写

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;
    }
}

这散发着设计拙劣的气息。如果B不被“支持”,它就不应该是C的基类。这让人觉得设计很糟糕。如果B不被“支持”,它就不应该是C的基类。这或多或少是JDK如何处理集合类的。例如,
AbstractCollection
,通过抛出
UnsupportedOperationException
来实现
clear
方法。支持该方法的派生类使用所需的功能重写,不支持该方法的其他派生类从基类获取默认行为(引发异常)。但是如果我有很多派生类,这是否意味着我需要在每个派生类中定义重写函数?我个人,我总是觉得通过接口提供一个方法,然后抛出一个不受支持的操作异常,味道很难闻。@longli不,你只在应该返回true的子类中重写
isSupported
。这或多或少是JDK处理集合类的方式。例如,
AbstractCollection
,通过抛出
UnsupportedOperationException
来实现
clear
方法。支持该方法的派生类使用所需的功能重写,不支持该方法的其他派生类从基类获取默认行为(引发异常)。但是如果我有很多派生类,这是否意味着我需要在每个派生类中定义重写函数?我个人,我总是觉得通过接口提供方法,但随后抛出一个不支持的操作异常,味道非常难闻。@longli不,您只在应该返回true的子类中重写
isSupported