我的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}})我懒得两次编写代码。
答案 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);
}
。