我想在Smalltalk中的其中一個類中訪問類變量。如何訪問Smalltalk中的類變量
我有兩個類:Class1和Class2。
Class1有以下變量:年月日時分。 Class2具有以下變量:開始時間結束時間。 在爲Class2中初始化方法我有以下幾點:
start-time := Class1 new.
end-time := Class1 new.
現在,我想分配2012年度開始時,我該如何訪問一年變量Class1的對象開始時間?
我想在Smalltalk中的其中一個類中訪問類變量。如何訪問Smalltalk中的類變量
我有兩個類:Class1和Class2。
Class1有以下變量:年月日時分。 Class2具有以下變量:開始時間結束時間。 在爲Class2中初始化方法我有以下幾點:
start-time := Class1 new.
end-time := Class1 new.
現在,我想分配2012年度開始時,我該如何訪問一年變量Class1的對象開始時間?
既然你發送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'
不是有效的變量名稱。
我想在Smalltalk中的一個類中訪問類變量。
你確定在這種情況下你想要Class變量嗎?一個類變量(或屬性一次只保留一次,它可以被該類的所有實例以及所有子類的所有實例訪問,並且可以由子類本身訪問。
如果你想要的是產卵許多對象,每提一個不同的時間,或開始時間和結束時間,那麼你就需要使用更多的普通實例變量。
但是,如果你想存儲一個時間,並且只有一次,那麼是的,你可以將信息存儲在類本身中。
我有兩個類ses:Class1和Class2。
,我會打電話的Class1 「時間」 我會打電話給等級2 「StartEndTime」
時間有以下變量:
year month day hour minute
。StartEndTime
有以下變量: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.
的錯誤,在'year:'方法中返回'self'都沒有意義。如果沒有其他提供,這是默認返回值。用於'initialize'。此外,這個問題被標記爲'Pharo',它從'new'自動調用'initialize',所以你調用它兩次。這些評論並沒有提供任何附加價值,並且在「年份」中:它確實是錯誤的/誤導性的。最後,但並非最不重要,'StartEndTime'根本不應該有'year:'方法。 –
是的 - 太早按下'保存'。仍在努力。 –
儘管默認情況下會自我返回,但確保顯式返回沒有任何傷害。在教程代碼中,從清晰度和清晰度的角度來看,還有一些好處。 –
非常感謝!無論是爲了回答,還是爲了糾正實例變量 – Bouet