Objective C - Singleton静态方法覆盖不适用于多个子类

时间:2015-11-17 12:22:31

标签: ios objective-c inheritance singleton instancetype

我有什么

我的项目中有多个单身人士,他们分享一些范围,领域和功能。所以我决定对它们进行结构化并创建一个名为BaseSingleton的父类。作为单身人士,它有template<class T> class Matrix { private: ... public: ... typedef typename std::vector<T>::const_iterator const_iterator; const_iterator end() { return mat[rowsNum][colsNum]; } const_iterator begin() { return mat[0][0]; } } } ,所有子类也是如此。现在我有一个+(instancetype) sharedInstance类和三个子类:

  • PublicApi
  • UserService
  • OrderStorage
BaseSingleton中的

BaseSingleton有一个共同的实现:

+(instancetype) sharedInstance

我需要什么:

我需要在我们的Singleton子类上调用+(instancetype) sharedInstance { static BaseSingleton* _sharedInstance = nil; static dispatch_once_t once_token; dispatch_once(&once_token, ^{ _sharedInstance = [[self alloc] init]; // no override for init method }); return _sharedInstance; } 时才能正常工作。含义,sharedInstance返回PublicApi的实例,PublicApi返回UserServiceUserService返回OrderStorage个实例,,无需实施sharedInstance

问题是什么:

所以我认为在OrderStorage中使用instancetype可以完成工作,因为使用+(instancetype) sharedInstance会使类方法返回相关的返回类型(读入{{ 3}})。因此,如果在PublicApi或UserService上调用,instancetype将返回相关类型,分别是PublicApi或UserService(再次,两者都没有实现sharedInstance)。

这只适用于一个子类(sharedInstance)。但是当添加其他两个子类时,在其中一些子类上调用PublicApi将不会产生正确的返回类型。例如,sharedInstance会返回[PublicApi sharedInstance]的实例,但PublicApi也会返回[UserService sharedInstance]的实例,PublicApi也是如此。

我认为问题存在于OrderStorage实现中的静态_sharedInstance中。在应用程序运行时期间首先调用[BaseSingleton sharedInstance],因此[PublicApi sharedInstance]方法实例化dispatch_once并为其指定_sharedInstance类型。 PublicApi内的代码块永远不会再次执行,这就是为什么静态变量永远不会更改其类型并在dispatch_oncePublicApi中以[UserService sharedInstance]的形式返回。

任何优雅的方式来做我要问的事情? (当然,除了为每个子类实现[OrderStorage sharedInstance]之外,这也违背了继承BaseSingleton的整个目的。)

2 个答案:

答案 0 :(得分:4)

单身人士的共同基础本身就是一个矛盾。

显而易见的是,使用sharedSingleton实现时,只有一个 dispatch_once_t令牌。因此,dispatch_once_t中的代码只会在您的应用程序中执行一次。 _sharedInstance也只有一个静态变量,因此它不可能返回两个不同的sharedInstance值。

不要这样做。

答案 1 :(得分:1)

如前所述,这种架构存在问题,说这很有可能。在sharedInstance中,您需要对if&#39; self&#39;进行一系列级联测试。 (班级)==说[公共班级]其他......

然后,您的方法有多个静态变量,每个类处理一个。