如何确定子类是否调用了方法

时间:2012-08-03 16:10:37

标签: objective-c

在objective-c中,如果特定方法被(调用)子(ren)覆盖,如何在超类中确定?

例如,在下面,子类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];
}

2 个答案:

答案 0 :(得分:3)

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

在大多数情况下,基于它是否被覆盖来更改超类的方法行为并不是一个好主意,因为这意味着超类是第二次猜测子类的行为和意图。例如,如果有一天有人编写了一个想要的子类来获取超类提供的默认设置,原因是你没有想到的?

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

答案 1 :(得分:0)

您可以将变量添加到超类(BOOL类型,作为示例),在基类的init中定义它,并在子类的init中重新定义。因此,您始终可以确定是否从子类调用了方法。