Cincom Visualworks Smalltalk - 类方法初始化

时间:2013-09-22 18:20:05

标签: smalltalk

为新手问题道歉,但尽管经过长时间的尝试,我还是没想到这一点。

我在Cincom Visualworks中使用NewClass功能创建了一个矩阵类。

Smalltalk.Core defineClass: #Matrix
    superclass: #{Core.Object}
    indexedType: #none
    private: false
    instanceVariableNames: 'rowCount columnCount cellValues '
    classInstanceVariableNames: ''
    imports: ''
    category: ''

添加了以下类方法:

withRowCount: rowCount withColumnCount: columnCount withCellValues: cellValues
    ^self new rowCount: rowCount columnCount: columnCount cellValues: cellValues.

添加了以下访问者方法:

cellValues
    ^cellValues
cellValues: anObject
    cellValues := anObject
columnCount
    ^columnCount
columnCount: anObject
    columnCount := anObject
rowCount
    ^rowCount
rowCount: anObject
    rowCount := anObject

我在工作区中有这个代码:

|myMatrix|
myMatrix := Matrix rowCount: 5 columnCount: 5 cellValues: 5.
Transcript show: (myMatrix rowCount).

但编译器说该消息未定义。 我猜我的班级方法没有按预期工作。 有人可以指出我哪里出错吗?

1 个答案:

答案 0 :(得分:1)

首先:Matrix没有rowCount:columnCount:cellValues:方法。你可能意味着Matrix withRowCount: 5 withColumnCount: 5 withCellValues: 5

其次,我在想方法返回最后一个表达式的值。所以链接方法并不是那样的。 (即使它确实如此,它仍然看起来像一条消息。)

你的类方法应该读起来像

withRowCount: rowCount withColumnCount: columnCount withCellValues: cellValues
    | newMatrix |
    newMatrix := self new.
    newMatrix rowCount: rowCount;
              columnCount: columnCount;
              cellValues: cellValues.
    ^newMatrix

;分解消息,并告诉Smalltalk将所有三个消息发送到newMatrix

然后你可以像

一样使用它
|myMatrix|
myMatrix := Matrix withRowCount: 5 withColumnCount: 5 withCellValues: 5.
Transcript show: (myMatrix rowCount).