2015-12-02 116 views
2

我想在Smalltalk中的其中一個類中訪問類變量。如何訪問Smalltalk中的類變量

我有兩個類:Class1和Class2。

Class1有以下變量:年月日時分。 Class2具有以下變量:開始時間結束時間。 在爲Class2中初始化方法我有以下幾點:

start-time := Class1 new. 
end-time := Class1 new. 

現在,我想分配2012年度開始時,我該如何訪問一年變量Class1的對象開始時間?

回答

9

既然你發送new消息,我會假設你有興趣實例變量類,而不是類變量(共享變量)(見菲羅對象模型Updated Pharo By Example理解的差異)。

在Pharo中,所有類/實例變量都是私有的,因此訪問它們的方式是創建訪問器。

添加到您的Class1的方法

Class1>>year 
    ^year 

Class1>>year: aYear 
    year := aYear 

然後你就可以用適當的值將消息發送到類:

Class2>>initialize 
    startTime := Class1 new. 
    startTime year: 2012. 

    "or by using a cascade" 
    startTime := Class1 new 
     year: 2012; 
     yourself. 

如果因任何原因,你需要訪問沒有存取變量,您可以使用元編程:

startTime instVarNamed: #year "meta-getter" 
startTime instVarNamed: #year put: 2012 "meta-setter" 

最後,'start-time'不是有效的變量名稱。

+0

非常感謝!無論是爲了回答,還是爲了糾正實例變量 – Bouet

1

我想在Smalltalk中的一個類中訪問類變量。

你確定在這種情況下你想要Class變量嗎?一個類變量(或屬性一次只保留一次,它可以被該類的所有實例以及所有子類的所有實例訪問,並且可以由子類本身訪問。

如果你想要的是產卵許多對象,每提一個不同的時間,或開始時間和結束時間,那麼你就需要使用更多的普通實例變量。

但是,如果你想存儲一個時間,並且只有一次,那麼是的,你可以將信息存儲在類本身中。

我有兩個類ses:Class1和Class2。

,我會打電話的Class1 「時間」 我會打電話給等級2 「StartEndTime

時間有以下變量:year month day hour minuteStartEndTime有以下變量:startTime endTime。在StartEndTime初始化方法我有以下幾點:

startTime := Time new. endTime := Time new.

現在我要到2012年分配年度開始時間,我怎麼訪問一年變量對象開始時間?

約定是命名與屬性同名的getter訪問器方法。在這種情況下,Time對象實例將有一個year getter方法,該方法返回Time對象的年份。

startTime year會再返回名爲year

同樣,二傳手存取方法具有相同的名稱作爲自己的屬性,但後綴的變量「:

startTime year: 2012隨後將設置名爲year給變量2012

把這些爲initialize方法將意味着:

StartEndTime >> initialize 
"Returns an initialized StartEndTime" 
    startTime := Time new. 
    endTime := Time new. 
    ^self 

Time >> year: anInt 
"Returns receiver with its year set to the year argument." 
    year := anInt. 
    ^self 

在Workspace(或遊樂場)

"create a new StartEndTime instanceobject" 
aStartEndTime := StartEndTime new initialize. 
aStartEndTime startTime: 2012. 
+1

的錯誤,在'year:'方法中返回'self'都沒有意義。如果沒有其他提供,這是默認返回值。用於'initialize'。此外,這個問題被標記爲'Pharo',它從'new'自動調用'initialize',所以你調用它兩次。這些評論並沒有提供任何附加價值,並且在「年份」中:它確實是錯誤的/誤導性的。最後,但並非最不重要,'StartEndTime'根本不應該有'year:'方法。 –

+0

是的 - 太早按下'保存'。仍在努力。 –

+1

儘管默認情況下會自我返回,但確保顯式返回沒有任何傷害。在教程代碼中,從清晰度和清晰度的角度來看,還有一些好處。 –