在 Pharo Smalltalk 中创建 class?
creation of a class in Pharo Smalltalk?
我一直在关注以下 link 在 Pharo 中制作 class 的示例:
https://ci.inria.fr/pharo-contribution/job/UpdatedPharoByExample/lastSuccessfulBuild/artifact/book-result/PharoObjectModel/PharoObjectModel.html#fig:colorInstanceClassSide
就是做狗和鬣狗的例子class。首先,我创建了一个名为 TestC 的包,并在实例中 class 我做了以下内容:
据我所知,如果我错了请纠正我,实例端是我创建实例化对象时将起作用的方法的地方,而 class 端不需要对象被创建以发挥作用;就像 Java.
中的静态方法 class
我现在的第一个问题是为什么在接受更改后它仍然出现!我的 classes?
左侧的符号
按照教程那么我应该放下面的代码:
Dog class
instanceVariableNames: 'count'
现在我不知道放哪了,在实例端还是在class端,我决定把它放在实例端如下:
我最后的方法如下,我把它们放在 class 一边:
enter image description here
我已经使用以下代码测试了成绩单中的 classes:
aDog := Dog new.
Dog count.
bDog := Dog new.
Dog count.
并且有效,但我想知道我是否做出了将这些方法放在 class 方面的正确决定( 第二个问题 ),如果谁能给我一个在这个例子中放在实例端的方法的例子?
谢谢
第一个问题
class前面的感叹号!
是点击它的邀请。在这种情况下,它会提醒您 classes 应该有评论(为了文档)。
题外话
每个 class 定义其实例的形状(或结构)和行为。形状由class创建消息中的实例变量给出,如
Object subclass: #Dog
instanceVariableNames: 'name breed birthdate'
classVariableNames: ''
package: 'TestC'
对于您在 class
的实例端创建方法的行为
breed: aString
breed := aString
有了这个你就有了一个功能齐全的对象
dog := Dog new.
dog name: 'Taylor'; breed: 'Great Dane'
然而,classes 也是对象。所以,它们可能有自己的形状。要将实例变量添加到 class 的形状,请发送消息:
Dog class instaceVariableNames: 'count'
注意这个消息的接收者是Dog
class(一个Metaclass
)的class,这是有道理的,因为它是class塑造他们实例的人。
在您的示例中,每次创建 Dog
的新(实例)时,Dog
class 的 count
ivar 将增加 1。这可能服务于跟踪到目前为止已创建的 Dog
实例的数量。然而,这些实体将不会意识到这一事实。
第二题
是的,ivar count
和 initialize
、increment
和 retrieve
的方法属于 class 一方。为什么?因为它们旨在跟踪您的 class 已创建的实例数。这是否有用,是另一个问题;事实上,它们在实例方面毫无意义(毕竟,幸运的狗过着令人兴奋的生活,从不计算任何东西。)
我一直在关注以下 link 在 Pharo 中制作 class 的示例: https://ci.inria.fr/pharo-contribution/job/UpdatedPharoByExample/lastSuccessfulBuild/artifact/book-result/PharoObjectModel/PharoObjectModel.html#fig:colorInstanceClassSide
就是做狗和鬣狗的例子class。首先,我创建了一个名为 TestC 的包,并在实例中 class 我做了以下内容:
据我所知,如果我错了请纠正我,实例端是我创建实例化对象时将起作用的方法的地方,而 class 端不需要对象被创建以发挥作用;就像 Java.
中的静态方法 class我现在的第一个问题是为什么在接受更改后它仍然出现!我的 classes?
左侧的符号按照教程那么我应该放下面的代码:
Dog class
instanceVariableNames: 'count'
现在我不知道放哪了,在实例端还是在class端,我决定把它放在实例端如下:
我最后的方法如下,我把它们放在 class 一边:
enter image description here
我已经使用以下代码测试了成绩单中的 classes:
aDog := Dog new.
Dog count.
bDog := Dog new.
Dog count.
并且有效,但我想知道我是否做出了将这些方法放在 class 方面的正确决定( 第二个问题 ),如果谁能给我一个在这个例子中放在实例端的方法的例子?
谢谢
第一个问题
class前面的感叹号!
是点击它的邀请。在这种情况下,它会提醒您 classes 应该有评论(为了文档)。
题外话
每个 class 定义其实例的形状(或结构)和行为。形状由class创建消息中的实例变量给出,如
Object subclass: #Dog
instanceVariableNames: 'name breed birthdate'
classVariableNames: ''
package: 'TestC'
对于您在 class
的实例端创建方法的行为breed: aString
breed := aString
有了这个你就有了一个功能齐全的对象
dog := Dog new.
dog name: 'Taylor'; breed: 'Great Dane'
然而,classes 也是对象。所以,它们可能有自己的形状。要将实例变量添加到 class 的形状,请发送消息:
Dog class instaceVariableNames: 'count'
注意这个消息的接收者是Dog
class(一个Metaclass
)的class,这是有道理的,因为它是class塑造他们实例的人。
在您的示例中,每次创建 Dog
的新(实例)时,Dog
class 的 count
ivar 将增加 1。这可能服务于跟踪到目前为止已创建的 Dog
实例的数量。然而,这些实体将不会意识到这一事实。
第二题
是的,ivar count
和 initialize
、increment
和 retrieve
的方法属于 class 一方。为什么?因为它们旨在跟踪您的 class 已创建的实例数。这是否有用,是另一个问题;事实上,它们在实例方面毫无意义(毕竟,幸运的狗过着令人兴奋的生活,从不计算任何东西。)