SweetDream
高歌一壶新酿酒,醉抱青山不必归。

class Base
{
   Type GetType()
  {
    return Type.Base;
  }   
}

Class DeriveClassA : Base
{
   Type GetType()
   {
      return Type.DeriveClassA;
   }
   public void AFounction()
   {
       // do sthing...
   }
}

Class DeriveClassB : Base
{
   Type GetType()
   {
      return Type.DeriveClassB;
   }
   public void BFounction()
   {
      // do anther sthing
   }
}

enum Type
{
    Base,
    DeriveClassA,
    DeriveClassB
}
从OO来看这不是一个好的设计,因为Base知道Type枚举,从而增加一个新的子类就会修改Enum Type,从而导致Base重新编译,从而导致所有的子类重新编译。然而如果从修改的角度上来看,似乎没有什么大的修改,仅仅是需要重新编译一遍。好处是,每个类都知道自己是什么类型。使用的时候
void Fountion(const Base& myclass)
{
   switch(myclass.GetType())
   {
      case Base:
          // dosth....
          break;
      case DeriveClassA:
          // castdown DeriveClassA,然后执行DeriveClassA特有的方法AFounction
          break;
      case DeriveClassB:
          // castdown DeriveClassB,然后执行DeriveClassB特有的方法BFounction
          break;
      default:
          break;
   }
}
如果这样的话,那么好,一个疯狂的想法,不管什么类都可以从一个这样的base class派生,然后GetType,然后castdown,但这很糟糕。没有任何复用价值,而且enum很难维护。但这里是对一系列is-a关系的类采用这个方法。
用户使用没有透明度,但是用户要知道AFounction和BFounction必须知道DeriveClassA和DeriveClassB,归根到底是接口设计不当,最好是让用户只知道接口(Base),而不知道他的实现。 -___-

posted on 2006-11-30 10:38  SweetDream  阅读(1075)  评论(1编辑  收藏  举报