2013-03-18 46 views
1

我在寫一些使用溫度的代碼。所以我想要一個能夠保持規模被使用的類(C/F)和價值。我使類不可變(通過在實現類中使用類別)。我想要一個轉換器。在Java中,我們通常會執行一個靜態方法並讓它返回一個新實例,但是您不能在O-C中執行此操作,因爲+方法是類方法,並且無法訪問實例屬性。在目標C中使用init作爲複製轉換器?

所以我做了一個init方法,它將當前的溫度實例和我們想要轉換的比例。長時間完成C++後,這就像一個拷貝構造函數。

這裏的問題是,是否有更好的方法或什麼將被視爲標準做法。因此,要獲得一個轉換,你會怎麼做:

Temperature *freezingF = [[Temperature alloc]initWithScale:Fahrenheit andValue:@32.0]; 
Temperature *freezingC = [[Temperature alloc]initWith:freezingF andScale:Celsius]; 

assertThat(freezingC.value, is(@0)); 

(縮短變量名限制滾動...)

+0

類方法可以訪問相同類的實例的私有ivars。你使用' - >'語法。 'someInstance - > _ someIvar'。 – rmaddy 2013-03-18 04:03:04

+0

在這裏有一個答案,說+方法不能,因爲他們是類方法..什麼NSNumber的例子,它有所有numberWith____方法,這基本上是類工廠。 – Rob 2013-03-18 04:44:06

+0

所有'numberWithXXX'方法都是相應的'alloc/initWithXXX'方法的方便包裝。我不會稱他們爲工廠方法。 – rmaddy 2013-03-18 04:48:40

回答

2

爲什麼不添加convertTo:實例方法,該方法在新單元中返回一個新的不可變溫度實例?

- (Temperature *)convertTo:(TemperatureScale)scale { 
    float newValue = ... // calculate new value 
    return [[Temperature alloc] initWithScale:scale andValue:newValue]; 
} 

那麼你的代碼變成:

Temperature *freezingF = [[Temperature alloc]initWithScale:Fahrenheit andValue:@32.0]; 
Temperature *freezingC = [freezingF convertTo:Celsius]; 
+0

主要是因爲它讓我覺得我正在將一個實例變成一個工廠..? – Rob 2013-03-18 04:24:20

+0

查看'NSString'的每個實例方法,例如返回一個新的'NSString'。這不會有什麼不同。 – rmaddy 2013-03-18 04:26:11

+0

雖然NSString也有一個拷貝構造函數。另一種看待這種情況的方式可能是返回的是原始的不可變表示,例如,只是一個不同規模的副本,在這種情況下,它不是一個真正的工廠.. – Rob 2013-03-18 04:41:48

3

我將存儲在K或C中的後盾值,然後用settersgetterssetKValue:setFValue:kValue,fValue。因爲它們在不同單元中基本上是相同的值

0

基於這裏的討論中,另一種選擇是:

+(Temperature *)convert:(Temperature *)from toScale:(TemperatureScale)newScale; 

這將被稱爲像這樣:

Temperature *freezingF = [[Temperature alloc]initWithScale:Fahrenheit andValue:@32]; 
Temperature *freezingC = [Temperature convert:freezingF toScale:Celsius]; 

這是基於NSNumber類的方法od示例:numberWithFloat,Int等

+2

對此使用類方法是一個糟糕的設計。您想要對現有實例執行操作。因此它應該是一個實例方法。您在這裏建議使用的類方法與'NSNumber'的各種'numberWithXXX'方法完全不同。 – rmaddy 2013-03-18 04:53:44