2011-08-26 82 views
0

考虑以下2种方法:OO继承问题

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();

我的问题:解决这类问题的最好方法是什么?这使我手中的一个正在父类的方法,返回布尔

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

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

这是最好的解决办法的功能?

回答

0

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

像超:

virtual void wrapping(){}; 

然后每个孩子:

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

不知道我已经清楚了。

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