调用超类的设置代码

时间:2015-12-27 22:01:39

标签: objective-c

我的A级初始化如下:

- (instancetype)init // designated initializer
{
    self = [super init];

    if (self) {
        [self setup]; // just sets some properties
    }

    return self;
}

我有以下B类,它的子类是A:

- (instancetype)init 
{
    self = [super init]; // calls the initializer of A and SHOULD call the setup code of A but it does not

    if (self) {
        [self setup]; // just sets some properties for B
    }

    return self;
}

我的问题:

B应该调用A的设置方法但不是由于Objective-C的动态类型。相反,B将其设置代码称为两次

如何解决此问题(除了重命名方法)或甚至更好还有更好的方法吗?

我可以将setup中编写的代码移动到init,但问题是我有多个指定的初始值设定项(例如:UIViewControllers有initWithFrame:和{{ 1}})我懒得两次编写代码。

2 个答案:

答案 0 :(得分:1)

我不确定你拒绝重命名这些方法的原因。这是一个简单的解决方案。

另一种方法是使用函数而不是方法。函数是静态调度的,而不是动态调度的。

例如,在A

的实施中
static void setup(A* self)
{
    self.someProperty = /* ... whatever ... */;
}

- (instancetype)init // designated initializer
{
    self = [super init];

    if (self) {
        setup(self); // just sets some properties
    }

    return self;
}

同样适用于B

在函数中,self没有任何特殊含义,因此它只是一个局部变量名。如果您愿意,可以使用另一个。

假设函数在@implementation内,它具有对对象的完全访问权限,包括私有实例变量。因此,setup()可以使用self->_someProperty代替self.someProperty

答案 1 :(得分:1)

一个简单的方法呢?在setup致电B[super setup]拨打setup,不要在B中致电// routes Route::get('/wiseweasel/{article}', 'WiseweaselController@singleArticle'); // Article model public function getRouteKeyName() { return 'slug'; } // controller public function singleArticle(Article $article) { dd($article); }