RTTI与其他方法

时间:2010-07-30 13:05:56

标签: design-patterns rtti

我的一些课程应该区别对待。哪种解决方案更好:

  1. 向我的类层次结构引入新接口,并使用RTTI(运行时标识)检查该类是否实现它
  2. 添加一个返回布尔值的方法,该值指示此类是应该正常处理还是值得特殊处理
  3. 以下示例说明了上述情况:

    1

    interface SpecialTreatment {}
    
    class Base {}    
    
    class Special extends Base implements SpecialTreatment {}
    
    class Normal extends Base {}
    
    
    Base reference = new Special();
    if(reference instanceof SpecialTreatment)
        // do something special
    else
        // normal class
    

    2

    interface Treatment {
        boolean special();
    }
    
    class Base {}
    
    class Special extends Base implements Treatment {
        boolean special() { return true; }
    }
    
    class Normal extends Base implements Treatment {
        boolean special() { return false; }
    }
    
    Treatment reference = new Special();
    if(reference.special() == true)
        // do something special
    else
        // normal class
    

1 个答案:

答案 0 :(得分:1)

如果以不同方式处理该类的“原因”是设计决策,则通过接口签名将其标记为如解决方案1中那样。

如果您的应用程序中的某个状态可能会对此进行管理,请使用解决方案2.

这方面的例子是java.io.Serializable接口,没有用于标识可序列化实现的方法或字段。您在设计时决定对象是否可序列化。

附加评论之后关于instanceof表现的说明。

您还可以考虑使用Annotations替代......

- 在董事会上发表评论后编辑---

如果你真的想不要关注instanceof(非常快)或注释,你可以这样做..

interface Special {
    bool isSpecial();
}

abstract class RuntimeSpecial implements Special {
    protected abstract bool _determineSpecial();

    public isSpecial() { return _determineSpecial(); }

}

class IsSpecial implements Special {
    public isSpecial() { return true; }
}

class IsNotSpecial implements Special {
    public isSpecial() { return false; }
}

现在扩展适当的......