У нас есть одноэлементный класс в одной из наших статических библиотек. Это синглтон, потому что мы хотим быть в состоянии «помнить» его состояние во все времена. По сути, это синглтон управления пользователями.Как сделать мой Singleton класс расширяемым?
Имеет свойство User *user
и имеет методы, такие как - (void)authenticateUser
.
Мы хотим доставить это клиенту, который захочет создать свой собственный метод - (void)authenticateUser
. Для этого я предположил, что они расширят класс UserManager
и просто переопределяют этот метод.
Однако, поскольку это одноэлементный метод, он имеет следующие методы: - (id)sharedInstance
и обычным способом alloc
. Все они выглядят следующим образом:
static UserManager *_sharedInstance = nil;
+ (id)sharedInstance {
@synchronized([UserManager class]) {
if(!_sharedInstance){
id temp = [[self alloc] init];
[temp class];
}
return _sharedInstance;
}
return nil;
}
+ (id)alloc {
@synchronized([UserManager class]) {
NSAssert(_sharedInstance == nil, @"Attempted to allocate a second instance of a singleton");
_sharedInstance = [super alloc];
return _sharedInstance;
}
return nil;
}
Поэтому, учитывая это, можно создать подкласс и расширить этот UserManager
класс? Могу ли я создать ChildUserManager
, который переопределяет функцию? Или мне придется переписать эти методы singleton для работы с «новым» дочерним классом?
Есть ли способ изменить эти методы, чтобы третьи стороны могли легко расширить этот класс?
Благодаря
Если статический не внутри Alloc, вы рискуете установить его кто-то. – Jano
Предположительно, как статичность находится внутри реализации, она недоступна вне этого класса? –
Правда, извините, это видно только в своем блоке компиляции. – Jano