OO继承问题

时间:2011-08-26 10:34:57

标签: oop inheritance

考虑以下两种方法:

class A{
  void Method1(){
    if(!something) return;
    DoX();
    DoY();

    DoZ();
}
class B{
  void Method2(){
    if(!something) return;
    DoX();
    DoY();

    DoP();
  }
}

显然可以写一个超类来避免干原理:

class Super{
  virtual void Method(){
    if(!something) return; //problem...
    DoX();
    DoY();
  }
}
class A:Super{
  override void Method(){
    inherited Method();
    DoZ();
  }
}
class B:Super{
  override void Method(){
    inherited Method();
    DoP();
  }
}

问题是!在第一个例子中检查它会用完的东西,而在第二个例子中,它将用完超类的方法,但在派生类中执行DoZ()或DoP(); < / p>

我的问题:解决此类问题的最佳方法是什么?来到我手中的那个让超类的方法成为一个返回bool的函数

 virtual bool Method(){ if(!something) return false;}

 override bool Method(){ if(!inherited Method()) return;}

这是最好的解决方法吗?

3 个答案:

答案 0 :(得分:1)

怎么样:

class Super {
    void Method() {
        if (!something) return;

        DoX();
        DoY();

        DoThingy();
    }

    abstract void DoThingy();
}

class A : Super {
    override DoThingy() {
        DoZ();
    }
}

class B : Super {
    override DoThingy() {
        DoP();
    }
}

答案 1 :(得分:0)

为什么不为DoP或Doz声明另一个虚拟方法,如果你想让它们以各自的名字公开,你可以将它们包装起来。

像超类一样:

virtual void wrapping(){};

然后每个孩子:

void wrapping() { DoP(); }
void wrapping() { DoZ(); }

不知道我是否已经清楚。

答案 2 :(得分:0)

另一种选择:将检查保留在派生方法中。也许派生类可能需要稍微不同的条件?

class Super{
  virtual void Method(){
    DoX();
    DoY();
  }
}
class A:Super{
  override void Method(){
    if(!something) return;
    inherited Method();
    DoZ();
  }
}
class B:Super{
  override void Method(){
    if(!something) return;
    inherited Method();
    DoP();
  }
}