2012-01-14 60 views
0

我需要將同一個方法從4個不同的類移到超類。 這樣的方法相同,除了一個變量的在他們聲明的類型完全一致:關於將幾個方法移到超類中

例如,在第一類中的方法我在第二類具有

FirstClass var = [[FirstClass alloc] init] 

SecondClass var = [[SecondClass alloc] init] 

等等。

在超類中實現這種變化的最好方法是什麼?

我應該在超類中使用NSClassFromString並從子類中的每個方法獲取每個字符串?

謝謝

+1

這是一種方法。可能有十幾種變化。但請注意,您可以使用'self'來獲取類 - 它將是子類的類,而不是超類。 – 2012-01-14 14:25:36

回答

0

如果您打算在子類中進行初始化的所有不同類型的iVar都來自普通類,那麼我會將該類存儲在超類中,否則將其作爲ID存儲。然後,在您的每個子類中設置一個屬性訪問器,以便在您需要時轉換iVar。

@interface superClass : NSObject{ 
    id _superIvar; 
} 
@end 

@implementation superClass : NSObject 
    ....super's code.... 
@end 

現在在子類實現的一個類別聲明一個屬性,如下圖所示(或接口,如果你希望它公開)

@interface subClass (private) 
@property (strong) ClassType *superIvar; 
@end; 

@implementation 
- (void) setSuperIvar:(ClassType *)superIvar{ 
    _superIvar = superIvar; 
} 
- (ClassType *) superIvar{ 
    return (ClassType *) _superIvar; 
} 

- (void) someMethodThatUsesSuperIvar{ 
    [self.superIvar doSomething]; 
} 
@end 

或者,如果你不想要打開_superIvar以直接訪問,可以在超類上設置屬性,並通過子類上的屬性進行訪問。但通過這種方式,您可以輕鬆訪問超級ivars投射到適當的類型。

+0

好吧,所以這兩個答案都建議使用一個iVar,而不是在我的原始代碼中聲明方法中的var。 – aneuryzm 2012-01-14 19:00:23

+0

我認爲我的是比其他的微妙不同,但要麼工作得很好。如果子類沒有在實現(.m文件)中聲明@private或聲明,則子類可以訪問其超級iVar。但是,您也可以在super中設置一個屬性訪問器,並通過super.propery從子類訪問它。 – 2012-01-14 23:03:10

1

我不是100%確定我明白你的意思。所以我可能會回答錯誤的問題

如果在你的類中你需要使用一個對象(我稱之爲worker在下面)來完成你的工作,但是這個對象的類直到後來才知道,你可以使用依賴注入(DI)。

MyClass.h

@interface MyClass : NSObject 

@property (nonatomic, retain) id<WorkerInterface> worker; 

@end 

MyClass.m

@implementation MyClass 

@synthesize worker = _worker; 

- (void)myMethod; 
{ 
    [self.worker doSomething]; 
} 

// You could also provide a default class to use if one is not passed in 
// 
// - (id<WorkerInterface)worker; 
// { 
//  if (!_worker) { 
//   _worker = [[DefaultWorker alloc] init]; 
//  } 
//  return _worker; 
// } 

@end 

現在,每當我實例這個I類可以簡單地通過在適當的對象要使用例如:

MyWorkerClass *worker = [[MyWorkerClass alloc] init]; // <- Conforms to @protocol(WorkerInterface) 
MyClass *instance = [[MyClass alloc] init]; 
instance.worker = worker; 

[instance doSomething]; 
+0

總之,(告訴我,如果我錯了)而不是在方法中聲明變量,則使用在子類中初始化的屬性。 – aneuryzm 2012-01-14 18:50:42

+0

該屬性在基類中聲明。每當您創建基類的實例或從中派生的類時,都會初始化並傳入該屬性。 – 2012-01-14 18:55:44