基本Smalltalk子类

时间:2012-02-27 23:50:31

标签: oop class subclass smalltalk gnu-smalltalk

我正在尝试创建一个非常简单的Vector类作为Smalltalk中Array的子​​类。我创建类的代码如下所示:

Array subclass: #Vector
Vector comment: 'I represent a Vector of integers'

Vector class extend [
new [
    | r |
    <category: 'instance creation'>
    r := super new.
    r init.
    ^r 
    ]
 ]

Vector extend [
init [
    <category: 'initialization'>
    ]
 ]

显然我还没有写过任何方法,但我只是想让这部分工作先行。如上所述创建类后,如果我输入:     v:= Vector new:4 我收到错误:

Object: Vector error: should not be implemented in this class, use #new instead
SystemExceptions.WrongMessageSent(Exception)>>signal (ExcHandling.st:254)
SystemExceptions.WrongMessageSent class>>signalOn:useInstead: (SysExcept.st:1219)
Vector class(Behavior)>>new: (Builtins.st:70)
UndefinedObject>>executeStatements (a String:1)
nil

我曾假设因为它是Array的子​​类,所以我可以用这种方式创建一个Vector。这样做的最佳方法是什么?谢谢!

编辑 - 我弄清楚了。在深入阅读本教程后,我发现我需要包含&lt; shape:#pointer&gt;

1 个答案:

答案 0 :(得分:4)

Array是一种特殊类,具有不同长度的可索引实例。

在GNU Smalltalk(您似乎正在使用)中,Array类声明为:

ArrayedCollection subclass: Array [       
    <shape: #pointer>

要继承此行为,您可以使用:

Array subclass: Vector [<shape: #inherit>]

但在大多数情况下,创建一个封装Array的类而不是从Array继承的类更有意义。

值得指出的是,OrderedCollection是来自C ++和Java的 vector 容器的Smalltalk等价物。