在Pharo Smalltalk中创建一个类?

6
我一直在按照以下链接中的示例来创建Pharo中的一个类: https://ci.inria.fr/pharo-contribution/job/UpdatedPharoByExample/lastSuccessfulBuild/artifact/book-result/PharoObjectModel/PharoObjectModel.html#fig:colorInstanceClassSide 这是用来创建Dog和Hyena类的示例。我首先创建了一个名为TestC的包,并在Instance类中做了以下操作: enter image description here enter image description here 据我所知,如果我想要在实例化对象时创建方法,我需要在实例层面上进行操作;而在类层面上进行操作,则不需要创建对象即可运行方法,就像Java中的静态方法一样。
在这个阶段,我有一个第一个问题:为什么在接受更改之后,我的类左侧仍然显示着!符号?
根据教程,然后我应该放置以下代码:
Dog class
    instanceVariableNames: 'count'

现在我不知道把它放在实例侧还是类侧,最终我决定把它放在实例侧如下:

enter image description here

而我最后拥有的方法如下,我把它们放在了类侧:

enter image description here

enter image description here

enter image description here

enter image description here

我已经使用以下代码在记录中测试了这些类:

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

这个代码可以运行,但我想知道我是否正确地将这些方法放在了类侧(第二个问题),如果正确的话,有没有人能给出在此示例中放在实例侧的方法的示例?

谢谢

1个回答

11

第一题

在类名前面的感叹号!是一个点击它的邀请。在这种情况下,它将提醒您应该为类编写注释(为了文档化)。

插曲

每个类都定义了其实例的形状(或结构)和行为。形状由类创建消息中的实例变量给出,例如

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),这是有道理的,因为是类来塑造它们的实例。
在您的示例中,每次创建新的Dog实例时,Dog类的count ivar将增加1。这可以用来跟踪到目前为止已创建多少个Dog实例。但是,这些实例将不知道这个事实。
第二个问题
是的,ivar count和方法initializeincrementretrieve属于类侧。为什么?因为它们旨在跟踪您的类创建了多少个实例。这是否有用是另一个问题;事实上,在实例侧它们没有任何意义(毕竟,幸运的狗狗过着充满激情的生活,从未计算任何东西)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接