9 - OOP - Smalltalk Classes (b)
-
Upload
the-world-of-smalltalk -
Category
Education
-
view
1.256 -
download
2
description
Transcript of 9 - OOP - Smalltalk Classes (b)
![Page 1: 9 - OOP - Smalltalk Classes (b)](https://reader035.fdocuments.us/reader035/viewer/2022062615/547ea7b0b4af9fda158b5684/html5/thumbnails/1.jpg)
S.Ducasse 1
QuickTime™ and aTIFF (Uncompressed) decompressorare needed to see this picture.
Stéphane [email protected]://www.listic.univ-savoie.fr/~ducasse/
Some Points on Classes
![Page 2: 9 - OOP - Smalltalk Classes (b)](https://reader035.fdocuments.us/reader035/viewer/2022062615/547ea7b0b4af9fda158b5684/html5/thumbnails/2.jpg)
S.Ducasse 2
License: CC-Attribution-ShareAlike 2.0http://creativecommons.org/licenses/by-sa/2.0/
![Page 3: 9 - OOP - Smalltalk Classes (b)](https://reader035.fdocuments.us/reader035/viewer/2022062615/547ea7b0b4af9fda158b5684/html5/thumbnails/3.jpg)
S.Ducasse 3
Outline•Class definition•Method definition•Basic class instantiation
![Page 4: 9 - OOP - Smalltalk Classes (b)](https://reader035.fdocuments.us/reader035/viewer/2022062615/547ea7b0b4af9fda158b5684/html5/thumbnails/4.jpg)
S.Ducasse 4
A template is proposed by the browser:Smalltalk defineClass: #NameOfClass superclass: #{NameOfSuperclass}
indexedType: #noneprivate: false
instanceVariableNames: 'instVarName1 instVarName2' classInstanceVariableNames: ''
imports: ''category: ''
Class Definition: The Class Packet
![Page 5: 9 - OOP - Smalltalk Classes (b)](https://reader035.fdocuments.us/reader035/viewer/2022062615/547ea7b0b4af9fda158b5684/html5/thumbnails/5.jpg)
S.Ducasse 5
Fill the TemplateSmalltalk defineClass: #Packet superclass: #{Object}
indexedType: #noneprivate: false
instanceVariableNames: 'contents addressee originator'
classInstanceVariableNames: '' imports: ''
category: 'LAN'
Automatically a class named “Packet class” is created. Packet is the unique instance of “Packet class”. To see it, click on the class button in the browser
![Page 6: 9 - OOP - Smalltalk Classes (b)](https://reader035.fdocuments.us/reader035/viewer/2022062615/547ea7b0b4af9fda158b5684/html5/thumbnails/6.jpg)
S.Ducasse 6
Class Definition A template is proposed by the browser:
NameOfSuperclass subclass: #NameOfClass instanceVariableNames: 'instVarName1 instVarName2' classVariableNames: 'ClassVarName1 ClassVarName2' poolDictionaries: '' category: 'CategoryName’
![Page 7: 9 - OOP - Smalltalk Classes (b)](https://reader035.fdocuments.us/reader035/viewer/2022062615/547ea7b0b4af9fda158b5684/html5/thumbnails/7.jpg)
S.Ducasse 7
Filling the TemplatesJust fill this Template in:
Object subclass: #PacketinstanceVariableNames: 'contents
addressee originator 'classVariableNames: ''poolDictionaries: ''category: 'LAN-Simulation’
Automatically a class named “Packet class” is created. Packet is the unique instance of Packet class. To see it, click on the class button in the browser
![Page 8: 9 - OOP - Smalltalk Classes (b)](https://reader035.fdocuments.us/reader035/viewer/2022062615/547ea7b0b4af9fda158b5684/html5/thumbnails/8.jpg)
S.Ducasse 8
Named Instance Variables instanceVariableNames: 'instVarName1 instVarName2' ... instanceVariableNames: 'contents addressee originator ' ...•Begins with a lowercase letter•Explicitly declared: a list of instance variables•Name should be unique in the inheritance chain•Default value of instance variable is nil•Private to the instance: instance based (vs. C++ class-based)•Can be accessed by all the methods of the class and its subclasses•Instance variables cannot be accessed by class methods.•A client cannot directly access instance variables. •The clients must use accessors to access an instance variable.
![Page 9: 9 - OOP - Smalltalk Classes (b)](https://reader035.fdocuments.us/reader035/viewer/2022062615/547ea7b0b4af9fda158b5684/html5/thumbnails/9.jpg)
S.Ducasse 9
Roadmap•Class definition•Method definition•Basic class instantiation
![Page 10: 9 - OOP - Smalltalk Classes (b)](https://reader035.fdocuments.us/reader035/viewer/2022062615/547ea7b0b4af9fda158b5684/html5/thumbnails/10.jpg)
S.Ducasse 10
Method Definition• Fill in the template. For example:
Packet>>defaultContents“returns the default contents of a Packet”^ ‘contents no specified’
Workstation>>originate: aPacketaPacket originator: self.
self send: aPacket
• How to invoke a method on the same object? Send the message to self
Packet>>isAddressedTo: aNode“returns true if I’m addressed to the node aNode”^ self addressee = aNode name
![Page 11: 9 - OOP - Smalltalk Classes (b)](https://reader035.fdocuments.us/reader035/viewer/2022062615/547ea7b0b4af9fda158b5684/html5/thumbnails/11.jpg)
S.Ducasse 11
Accessing Instance Variables
Using direct access for the methods of the class Packet>>isSentBy: aNode
^ originator = aNode
is equivalent to use accessorsPacket>>originator
^ originatorPacket>>isSentBy: aNode
^ self originator = aNode
Design Hint: Do not directly access instance variables of a superclass from subclass methods. This way classes are not strongly linked.
![Page 12: 9 - OOP - Smalltalk Classes (b)](https://reader035.fdocuments.us/reader035/viewer/2022062615/547ea7b0b4af9fda158b5684/html5/thumbnails/12.jpg)
S.Ducasse 12
Methods always return a Value• Message = effect + return value• By default, a method returns self• In a method body, the ^ expression returns the
value of the expression as the result of the method execution.
Node>>accept: thePacket self send: thePacket
This is equivalent to:
Node>>accept: thePacket self send: thePacket. ^self
12
![Page 13: 9 - OOP - Smalltalk Classes (b)](https://reader035.fdocuments.us/reader035/viewer/2022062615/547ea7b0b4af9fda158b5684/html5/thumbnails/13.jpg)
S.Ducasse 13
Methods always return a value• If we want to return the value returned by #send:
Node>>accept: thePacket^self send: thePacket.
• Use ^ self to notify the reader that something abnormal is arriving
MyClass>>foo…
^ self
![Page 14: 9 - OOP - Smalltalk Classes (b)](https://reader035.fdocuments.us/reader035/viewer/2022062615/547ea7b0b4af9fda158b5684/html5/thumbnails/14.jpg)
S.Ducasse 14
Some Naming Conventions• Shared variables begin with an upper case
letter• Private variables begin with a lower case
letter• For accessors, use the same name as the
instance variable accessed:
Packet>>addressee^ addressee
Packet>>addressee: aSymboladdressee := aSymbol
![Page 15: 9 - OOP - Smalltalk Classes (b)](https://reader035.fdocuments.us/reader035/viewer/2022062615/547ea7b0b4af9fda158b5684/html5/thumbnails/15.jpg)
S.Ducasse 15
Some Naming Conventions• Use imperative verbs for methods
performing an action like #openOn:, #close, #sleep
• For predicate methods (returning a boolean) prefix the method with is or has
• Ex: isNil, isAddressedTo:, isSentBy:
• For converting methods prefix the method with as
• Ex: asString
![Page 16: 9 - OOP - Smalltalk Classes (b)](https://reader035.fdocuments.us/reader035/viewer/2022062615/547ea7b0b4af9fda158b5684/html5/thumbnails/16.jpg)
S.Ducasse 16
Roadmap•Class definition•Method definition•Basic class instantiation
![Page 17: 9 - OOP - Smalltalk Classes (b)](https://reader035.fdocuments.us/reader035/viewer/2022062615/547ea7b0b4af9fda158b5684/html5/thumbnails/17.jpg)
S.Ducasse 17
Object InstantiationObjects can be created by:
- Direct Instance creation: new/new:- Messages to instances that create other objects- Class specific instantiation messages
![Page 18: 9 - OOP - Smalltalk Classes (b)](https://reader035.fdocuments.us/reader035/viewer/2022062615/547ea7b0b4af9fda158b5684/html5/thumbnails/18.jpg)
S.Ducasse 18
Object Creation- When a class creates an object = allocating memory + marking it to be instance of that class
![Page 19: 9 - OOP - Smalltalk Classes (b)](https://reader035.fdocuments.us/reader035/viewer/2022062615/547ea7b0b4af9fda158b5684/html5/thumbnails/19.jpg)
S.Ducasse 19
Instance Creation with newaClass new
returns a newly and UNINITIALIZED instance
OrderedCollection new -> OrderedCollection ()
Packet new -> aPacket
Default instance variable values are nil nil is an instance of UndefinedObject and only understands a limited set of messages
![Page 20: 9 - OOP - Smalltalk Classes (b)](https://reader035.fdocuments.us/reader035/viewer/2022062615/547ea7b0b4af9fda158b5684/html5/thumbnails/20.jpg)
S.Ducasse 20
Messages to InstancesMessages to Instances that create Objects
1 to: 6 (an interval)1@2 (a point)(0@0) extent: (100@100) (a rectangle)#lulu asString (a string)1 printString (a string)3 asFloat (a float)#(23 2 3 4) asSortedCollection
(a sortedCollection)
![Page 21: 9 - OOP - Smalltalk Classes (b)](https://reader035.fdocuments.us/reader035/viewer/2022062615/547ea7b0b4af9fda158b5684/html5/thumbnails/21.jpg)
S.Ducasse 21
Opening the Box
1 to: 6creates an interval
Number>>to: stop "Answer an Interval from the receiver up to the argument, stop, with each next element computed by incrementing the previous one by 1."
^Interval from: self to: stop by: 1
![Page 22: 9 - OOP - Smalltalk Classes (b)](https://reader035.fdocuments.us/reader035/viewer/2022062615/547ea7b0b4af9fda158b5684/html5/thumbnails/22.jpg)
S.Ducasse 22
Strings...1 printString
Object>>printString "Answer a String whose characters are a description of the receiver."
| aStream |aStream := WriteStream on: (String new: 16).self printOn: aStream.^ aStream contents
![Page 23: 9 - OOP - Smalltalk Classes (b)](https://reader035.fdocuments.us/reader035/viewer/2022062615/547ea7b0b4af9fda158b5684/html5/thumbnails/23.jpg)
S.Ducasse 23
Instance Creation1@2creates a point
Number>>@ y "Answer a new Point whose x value is the receiver and whose y value is the argument."
<primitive: 18> ^ Point x: self y: y
![Page 24: 9 - OOP - Smalltalk Classes (b)](https://reader035.fdocuments.us/reader035/viewer/2022062615/547ea7b0b4af9fda158b5684/html5/thumbnails/24.jpg)
S.Ducasse 24
Class-specific MessagesArray with: 1 with: 'lulu'OrderedCollection with: 1 with: 2 with: 3 Rectangle fromUser -> 179@95 corner: 409@219Browser browseAllImplementorsOf: #at:put:Packet send: ‘Hello mac’ to: #macWorkstation withName: #mac
![Page 25: 9 - OOP - Smalltalk Classes (b)](https://reader035.fdocuments.us/reader035/viewer/2022062615/547ea7b0b4af9fda158b5684/html5/thumbnails/25.jpg)
S.Ducasse 25
new and new:• new:/basicNew: is used to specify the size of
the created instance
Array new: 4 -> #(nil nil nil nil)
• new/new: can be specialized to define customized creation
• basicNew/basicNew: should never be overridden
• #new/basicNew and new:/basicNew: are class methods
![Page 26: 9 - OOP - Smalltalk Classes (b)](https://reader035.fdocuments.us/reader035/viewer/2022062615/547ea7b0b4af9fda158b5684/html5/thumbnails/26.jpg)
S.Ducasse 26
SummaryHow to define a class?What are instance variables?How to define a method?Instances creation methods