提供检查基类中的实例类型是一种好习惯

时间:2015-03-21 19:27:03

标签: 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 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类的实现,这有点奇怪)。

我知道我可以在每个派生类中提供覆盖功能。但是它是否有重复的代码,特别是如果我有很多派生类。

有人能给我一些建议吗?

由于

2 个答案:

答案 0 :(得分:4)

您应该覆盖子类中的isSupported,以便AD覆盖它以返回trueC定义默认行为(返回{{ 1}})和falseB继承该默认行为而不覆盖。

C

答案 1 :(得分:2)

基类应该永远不需要知道有关扩展它的类的任何信息。否则,在扩展它时需要修改基类。我会认为非常糟糕的风格(换句话说,它“闻起来” - 不,这不是侮辱 - 见“code smell”)。

为什么你需要这样做?