我有什么:
我的项目中有多个单身人士,他们分享一些范围,领域和功能。所以我决定对它们进行结构化并创建一个名为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
类和三个子类:
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
返回UserService
,UserService
返回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_once
和PublicApi
中以[UserService sharedInstance]
的形式返回。
任何优雅的方式来做我要问的事情? (当然,除了为每个子类实现[OrderStorage sharedInstance]
之外,这也违背了继承BaseSingleton的整个目的。)
答案 0 :(得分:4)
单身人士的共同基础本身就是一个矛盾。
显而易见的是,使用sharedSingleton实现时,只有一个 dispatch_once_t令牌。因此,dispatch_once_t中的代码只会在您的应用程序中执行一次。 _sharedInstance也只有一个静态变量,因此它不可能返回两个不同的sharedInstance值。
不要这样做。
答案 1 :(得分:1)
如前所述,这种架构存在问题,说这很有可能。在sharedInstance中,您需要对if&#39; self&#39;进行一系列级联测试。 (班级)==说[公共班级]其他......
然后,您的方法有多个静态变量,每个类处理一个。