簡體   English   中英

如何在Smalltalk中訪問類變量

[英]How to access class variables in Smalltalk

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

我有兩個類:Class1和Class2。

Class1具有以下變量:年月日小時分鍾。 Class2具有以下變量:start-time end-time。 在Class2的initialize方法中,我有以下內容:

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

現在我想將2012年分配給開始時間,如何在Class1對象的啟動時間中訪問year變量?

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

在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變量嗎? 一個Class變量(或屬性只保存一次。該類的所有實例都可以訪問它,所有子類的所有實例都可以訪問,並且子類本身也可以訪問它。

如果你想要的是產生許多對象,每個對象注意到不同的時間,或者startTime和endTime,那么你需要使用更普通的實例變量。

但是,如果您想存儲一次,而且只存儲一次,那么您可以將信息存儲在類本身中。

我有兩個類:Class1和Class2。

我將Class1稱為“ Time ”,我將Class2稱為“ StartEndTime

時間有以下變量: year month day hour minute StartEndTime具有以下變量: startTime endTime StartEndTime的initialize方法中,我有以下內容:

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

現在我想將2012年分配給startTime,如何在對象startTime中訪問year變量?

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

然后startTime year將返回名為year的變量

類似地,setter訪問器方法與其屬性具有相同的名稱,但后綴為' : '

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

在工作區(或游樂場)

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM