2015-07-13 65 views
1

我有一個類叫做A和三個子類的A:SubA0, SubA1, SubA2。我需要一本字典包含這些對象和我創造這樣說:NSDictionary包含幾個對象屬於一個層次結構

NSDictionary* dic = [[NSDictionary alloc]initWithObjectsAndKeys: 
        [[SubA0 alloc]init], @"SubA0", 
        [[SubA1 alloc]init], @"SubA1", 
        [[SubA2 alloc]init], @"SubA2", nil]; 

在類A有一個方法:

-(void)theMethod{ 
    NSLog(@"theMethod - Class A"); 
} 

此方法在所有三個子類覆蓋:

類SubA0:

-(void)theMethod{ 
    NSLog(@"theMethod - Class SubA0"); 
} 

類SubA1:

-(void)theMethod{ 
    NSLog(@"theMethod - Class SubA1"); 
} 

類SubA2:

-(void)theMethod{ 
    NSLog(@"theMethod - Class SubA2"); 
} 

在我ViewController,這行代碼:

[[dic objectForKey:classIdentifier]theMethod]; 

總是調用父類的方法,但很明顯,我不希望這樣。我希望系統根據類的類型調用正確的方法。

此問題與屬於NSDictionary的objectForKey:方法有關嗎?先謝謝你。

+2

@SaurabhPrajapati這不是造成問題的原因,問題清楚地表明,超類實現在調用子類實現時被調用。 –

+1

@SaurabhPrajapati:我不明白你的答案。問題是,當我調用從字典中提取的對象上的方法時,此對象始終被視爲A對象。這是錯誤的,因爲我的字典中的所有對象的類型都是SubA0,SubA1,SubA2 ... – superpuccio

+1

忽略問題中的拼寫錯誤(:在方法簽名的末尾導致編譯器錯誤)我還沒有能夠重現這個問題。你能發佈你正在使用的實際代碼嗎?此外,我會建議朝着[現代下標語法](http://nshipster.com/object-subscripting/)而不是繁瑣的字典初始化和objectForKey:方法。 –

回答

0

問題出在我的自定義初始值設定項中。該類A有兩個init方法:

-(instancetype)init; 
-(instancetype)initWithAParam:(Param *)defaultParam; 

和實現是:

-(instancetype)init{ 
    return [[A alloc] initWithAParam:0]; 
} 
-(instancetype)initWithAParam:(Param *)defaultParam{ 
    self = [super init]; 

    if(self){ 
     _param = defaultParam; 
    } 

    return self; 
} 

顯然,當我寫:

[[SubA0 alloc]init]; 
[[SubA1 alloc]init]; 
[[SubA2 alloc]init]; 

系統調用super init這個方法返回一個A對象。爲了解決這個問題,簡單地改寫init這樣:

-(instancetype)init{ 
    return [self initWithAParam:0]; 
} 

謝謝大家!

相關問題