2012-08-03 52 views
0

在Objective-C,怎么会在一个超类来确定,如果一个特定的方法是由它(调用)子(仁)覆盖叫什么名字?如何确定一个方法是由一个子类

例如,在下文中,子类Z不重写方法b为此基类X会做一些额外的缺省处理。然而,ZY在子类Y中实现了b,因此不需要默认处理。

// base class X 
-(void)a 
{ 
    // do something 
} 

-(void)b 
{ 
    if("no_child_has_implemented_b") { 
     // add some default behavior 
    } 
} 


// child class Y : X 
-(void)a 
{ 
    [super a]; 
} 

-(void)b 
{ 
    [super b]; 
} 


// child class Z : X 
-(void)a 
{ 
    [super a]; 
} 

// child class ZY : X 
-(void)a 
{ 
    [super a]; 
} 

回答

3

在一个合理的正常OO设计中,你不应该有一个基类知道一个子类是否覆盖它。如果你发现自己这样做,这是一个code smell,通常意味着有更好的方式做事。

根据是否被覆盖更改超法的行为是不是在大多数情况下是个好主意,因为这意味着超类的猜测子类的行为和意图。例如,如果有人某天某人写了一个子类,希望能够获得超类提供的默认设置,这是因为你没有想到的原因?

在子类中调用超级版本时,重写方法是非常正常的,而超级版本的基本设置与其类的相关,然后你的子类的重写方法在调用super之后可以做更多的事情。如果这不能处理你的情况,你可以让你的子类的方法不调用方法的超级版本 - 它只会执行它自己的代码。

+0

感谢您的详细回复。我同时让它工作,但会审查整体设计,具体针对您列出的可能风险。 – Frans 2012-08-03 17:07:25

+0

很酷。此外,如果您之前没有看到过,请稍微注意相关说明,查看“打开/关闭”原则:http://en.wikipedia.org/wiki/Open/closed_principle – occulus 2012-08-04 11:15:22

0

可以添加可变超类(BOOL类型,如样品)中的基类的初始化定义它和在子类的初始化重新定义。所以你总是可以确定方法是否从子类调用。

相关问题