簡體   English   中英

在Pharo Smalltalk中創建一個類?

[英]creation of a class in Pharo Smalltalk?

我一直在關注從Pharo在以下鏈接中創建課程的示例: https//ci.inria.fr/pharo-contribution/job/UpdatedPharoByExample/lastSuccessfulBuild/artifact/book-result/PharoObjectModel/PharoObjectModel.html#fig :colorInstanceClassSide

這是制作狗和鬣狗課程的例子。 首先,我創建了一個名為TestC的包,在Instance類中我創建了以下內容:

在此輸入圖像描述

在此輸入圖像描述

對於我所知道的,如果我錯了,請糾正我,實例方面是我創建在實例化對象時將起作用的方法,而類側則不需要創建對象來實現; 就像Java中的靜態方法類一樣。

我在這一點上的第一個問題是為什么在接受改變后它仍然出現了! 我班級左側的符號?

根據教程,我應該把以下代碼:

Dog class
    instanceVariableNames: 'count'

現在我沒有把它放在哪里,在實例端或類側,我決定將它放在實例端以下:

在此輸入圖像描述

我最后的方法如下,我把它們放在課堂上:

在此輸入圖像描述

在此輸入圖像描述

在此輸入圖像描述

在此輸入圖像描述

我使用以下代碼測試了Transcript中的類:

aDog := Dog new.
Dog count.
bDog := Dog new.
Dog count.

並且它有效,但我想知道我是否做出了正確的決定將這些方法放在類的一邊( 第二個問題 ),如果它的權利可以讓任何人給我一個方法的例子放在這個實例方面例?

謝謝

第一個問題

感嘆號! 在課堂前面是一個點擊它的邀請。 在這種情況下,它會提醒您類應該有注釋(為了文檔)。

插話

每個類都定義其實例的形狀(或結構)和行為。 形狀由類創建消息中的實例變量給出,例如

Object subclass: #Dog
  instanceVariableNames: 'name breed birthdate'
  classVariableNames: ''
  package: 'TestC'

對於您在類的實例端創建方法的行為

breed: aString
  breed := aString

有了這個你就有了一個完整的功能對象

dog := Dog new.
dog name: 'Taylor'; breed: 'Great Dane'

但是,類也是對象。 所以,他們可能有自己的形狀。 要將實例變量添加到類的形狀,請發送消息:

Dog class instaceVariableNames: 'count'

請注意,此消息的接收者是Dog類( Metaclass )的Metaclass ,這是有道理的,因為它是形成其實例的類。

在您的示例中,每次創建一個新的(實例) Dog時, Dog類的count ivar將增加1.這可以用於跟蹤到目前為止已創建了多少Dog實例。 但是,這些情況仍然沒有意識到這一事實。

第二個問題

是的,ivar countinitializeincrementretrieve它的方法屬於類側。 為什么? 因為它們旨在跟蹤您的類創建的實例數。 這是否有用,是一個不同的問題; 事實上,他們在實例方面沒有任何意義(畢竟,幸運的狗生活在令人興奮的生活中而沒有任何數字。)

暫無
暫無

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

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