0

在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];
}
4

2 回答 2

3

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

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

在子类中重写方法调用超级版本是很正常的,超级版本会进行与其类相关的基本设置,然后您的子类的重写方法在调用超级版本后会执行其他操作。如果这不能处理您的情况,您可以让您的子类的方法不调用该方法的超级版本——它只会执行自己的代码。

于 2012-08-03T16:21:06.537 回答
0

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

于 2014-03-19T10:36:21.590 回答