2012-11-09 61 views
0

我有一個Parent類和一個類Child。孩子來自父母。我只實例化Child類,但父類不會直接初始化,只能由子類初始化。 我至少需要父母是一個單身人士。如果這不起作用,孩子也是單身人士也可以。 我嘗試以下,但沒有將其更改爲單:Objective C具有類層次結構的單身人士

static MySingleton *sharedSingleton; 

+ (void)initialize 
{ 
    static BOOL initialized = NO; 
    if(!initialized) 
    { 
     initialized = YES; 
     sharedSingleton = [[MySingleton alloc] init]; 
    } 
} 

子類中調用[超級的init]實例化父。你能幫我嗎?

編輯:我爲我的解決方案(體系結構)添加一些背景信息:我有一個Web服務客戶端,它具有到Web服務的連接。我有一個基類(Parent),它具有關於連接的信息(經過身份驗證,如何連接等),並且具有不同的從此基類派生的子類。對不同子類的需求是,一個孩子負責一組Web服務邏輯,另一個孩子負責另一組Web服務邏輯。問題是,我想連接信息是單身人士(因爲他們都只使用一個連接,而不是很多)。

+0

'initialized'變量是多餘的,爲什麼不檢查if(sharedSingleton == nil)'? – 2012-11-09 17:12:58

+0

也許你可以簡單地解釋你想達到的目標,因爲父母是一個單身人士,而從它身上衍生出來的孩子對我來說看起來並不麻煩。也許有更好的解決方案? – Anton

回答

0

如果我正確你的要求是沒有意義的理解你,你似乎是混亂關係繼承。如果您有:

@interface Parent : NSObject ... 
@interface Child : Parent 

然後Child創建是一個Parent爲好,不可分割自身的一部分,沒有辦法分裂從ChildParent - 你有一個單一的對象。使用繼承不會爲多個孩子提供單個共享父級。

如果你想要很多孩子分享一個單親,那麼你需要你的Child有一個Parent。例如:

@interface Parent : NSObject ... 

@interface Child : NSObject 

@property (readonly) Parent *myParent; 

- (id) initAsChildOf:(Parent *)parent; 

... 

@end 

用作:

Parent *theParent = [Parent new]; 
Child *firstChild = [[Child alloc] initAsChildOf:theParent]; 
Child *secondChild = [[Child alloc] initAsChildOf:theParent]; 

如果你願意,你可以讓Parent一個單獨的類(只有一個實例可能),或共享實例類(一個共享實例,其他情況下可能)。

與繼承關係相反,很難(但並非不可能;-))從一個真正的單例類派生出來,如果這樣做,派生類本身就是一個單例。

你可以從共享實例派生類;並且可以編寫該類(再次硬),以便可以有且僅有一個實例不屬於派生類實例的一部分。

注:其他答案至今都爲您提供了代碼產生共享實例類,一真正的單例類是一個涉及多一點(你可以找到蘋果的文檔中的代碼),往往一共享實例類就足夠了。

HTH和我一直沒有誤解你的問題!

+0

thx,你可以添加解釋一個真正的單身人士和共享實例之間的區別嗎?我在蘋果的文檔中找不到任何有用的東西(有時文檔太舊了)。我在我的問題中添加了一些背景信息。你會推薦什麼? – tester

+0

一個_true singleton_是一個類最多隻能有一個實例;在Objective-C中創建一個通常涉及重寫'allocWithZone'和/或'init'來確保創建實例的任何嘗試都會返回_same_唯一實例。一個_shared實例_類只是一個帶有衆所周知的實例的類,它很容易獲得,通常使用一個類方法,比如'sharedInstance';該類的其他實例可能存在。許多可可課程遵循後面的模型,例如'NSFileManager'及其'defaultManager'。 – CRD

+0

我實際上發現,如果我用dispatch_once_t邏輯使用單例代碼,我不能使用allocWithZone。僅供參考。那麼我該如何防止某人在我的單身人士上使用alloc? – tester

0

把這一行static BOOL initialized = NO;在這行下面static MySingleton * sharedSingleton;像這樣

static MySingleton *sharedSingleton; 
static BOOL initialized = NO; 
+ (void)initialize 
{ 
    if(!initialized) 
    { 
    initialized = YES; 
    sharedSingleton = [[MySingleton alloc] init]; 
    } 
} 

希望有幫助!

0

這個通常的模式是:

static MySuperclass *singleton = nil; 
+ (void)initialize { 
    if (self == [MySuperclass class]) { 
     singleton = [[MySubclassProbabl alloc] init]; 
    } 
} 
1

更線程安全的選擇是這樣的:

+(MySingleton *)singleton { 
    static dispatch_once_t pred; 
    static MySingleton *shared = nil; 

    dispatch_once(&pred, ^{ 
     shared = [[MySingleton alloc] init]; 
    }); 
    return shared; 
} 
0

一點從其他的答案不同,這是創建現代的方式一個單身人士

static MySingleton * volatile sharedInstance = nil; 

+(MySingleton*) sharedInstance { 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     sharedInstance = [[MySingleton alloc] init]; 
    }); 

    return sharedInstance; 
} 

另外,通過你的問題的措辭和單身人士的用途(與父母/孩子的關係),我想說你必須重新考慮你的架構。