Stoop 413-abstract classes

576 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
576
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
9
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Stoop 413-abstract classes

  1. 1. Stéphane Ducasse 1 Stéphane Ducasse stephane.ducasse@inria.fr http://stephane.ducasse.free.fr/ Abstract Classes
  2. 2. S.Ducasse 2 Goal Abstract classes Examples
  3. 3. S.Ducasse 3 Abstract Classes • Should not be instantiated (abstract in Java) • But can define complete methods. • Defines a protocol common to a hierarchy of classes that is independent from the representation choices. • A class is considered as abstract as soon as one of the methods to which it should respond to is not implemented (can be a inherited one).
  4. 4. S.Ducasse 4 Abstract Classes in Smalltalk • Depending of the situation, override new to produce an error. • No construct:Abstract methods send the message self subclassResponsibility • Tools check this situation and exploit it. • Abstract classes are not syntactically different from instantiable classes, but a common convention is to use class comments: So look at the class comment and write in the comment which methods are abstract and should be specialized.
  5. 5. S.Ducasse 5 Example Boolean>>not "Negation. Answer true if the receiver is false, answer false if the receiver is true." self subclassResponsibility
  6. 6. S.Ducasse 6 Goal Abstract classes Examples
  7. 7. S.Ducasse 7 Boolean Objects false and true are objects described by classes Boolean,True and False
  8. 8. S.Ducasse 8 Conditional: messages to booleans • aBoolean ifTrue: aTrueBlock ifFalse: aFalseBlock • aBoolean ifFalse: aFalseBlock ifTrue: aTrueBlock • aBoolean ifTrue: aTrueBlock • aBoolean ifFalse: aFalseBlock (thePacket isAddressedTo: self) ifTrue: [self print: thePacket] ifFalse: [super accept: thePacket] • Hint:Take care — true is the boolean value and True is the class of true, its unique instance!
  9. 9. S.Ducasse Boolean Hierarchy • How to implement in OO true and false without conditional? • Late binding: Let the receiver • decide! • Same message on false and true • produces different results
  10. 10. S.Ducasse 10 Example “Class Boolean is an abstract class that implements behavior common to true and false. Its subclasses are True and False. Subclasses must implement methods for logical operations &, not, controlling and:, or:, ifTrue:, ifFalse:, ifTrue:ifFalse:, ifFalse:ifTrue:” Boolean>>not "Negation. Answer true if the receiver is false, answer false if the receiver is true." self subclassResponsibility
  11. 11. S.Ducasse 11 Not false not -> true true not -> false Boolean>>not "Negation. Answer true if the receiver is false, answer false if the receiver is true.” self subclassResponsibility False>>not "Negation -- answer true since the receiver is false." ^true True>>not "Negation--answer false since the receiver is true." ^false
  12. 12. S.Ducasse 12 | (Or) • true | true -> true • true | false -> true • true | anything -> true • false | true -> true • false | false -> false • false | anything -> anything
  13. 13. S.Ducasse 13 Boolean>> | aBoolean Boolean>> | aBoolean "Evaluating disjunction (OR). Evaluate the argument. Answer true if either the receiver or the argument is true." self subclassResponsibility
  14. 14. S.Ducasse 14 False>> | aBoolean false | true -> true false | false -> false false | anything -> anything False>> | aBoolean "Evaluating disjunction (OR) -- answer with the argument, aBoolean." ^ aBoolean
  15. 15. S.Ducasse 15 True>> | aBoolean true | true -> true true | false -> true true | anything -> true True>> | aBoolean "Evaluating disjunction (OR) -- answer true since the receiver is true." ^ self
  16. 16. S.Ducasse 16 Boolean,True and False
  17. 17. S.Ducasse 17 Abstract/Concrete Abstract method Boolean>>not "Negation. Answer true if the receiver is false, answer false if the receiver is true." self subclassResponsibility Concrete method defined in terms of an abstract method Boolean>>xor: aBoolean "Exclusive OR. Answer true if the receiver is not equivalent to aBoolean." ^(self == aBoolean) not When not is be defined in subclasses, xor: is automatically defined
  18. 18. S.Ducasse 18 Block Use in Conditional? • Why do conditional expressions use blocks? • Because, when a message is sent, the receiver and the arguments of the message are always evaluated. Blocks are necessary to avoid evaluating both branches.
  19. 19. S.Ducasse 19 Implementation Note Note that theVirtual Machine shortcuts calls to boolean such as condition for speed reason. Virtual machines such asVisualWorks introduced a kind of macro expansion, an optimisation for essential methods and Just In Time (JIT) compilation.A method is executed once and afterwards it is compiled into native code. So the second time it is invoked, the native code will be executed.
  20. 20. S.Ducasse 20 Magnitude I'm abstract class that represents the objects that can be compared between each other such as numbers, dates, numbers. My subclasses should implement < aMagnitude = aMagnitude hash Here are some example of my protocol: 3 > 4 5 = 6 100 max: 9 7 between: 5 and: 10
  21. 21. S.Ducasse 21 Magnitude Magnitude>> < aMagnitude ^self subclassResponsibility Magnitude>> = aMagnitude ^self subclassResponsibility Magnitude>> hash ^self subclassResponsibility
  22. 22. S.Ducasse 22 Magnitude Magnitude>> <= aMagnitude ^(self > aMagnitude) not Magnitude>> > aMagnitude ^aMagnitude < self Magnitude>> >= aMagnitude ^(self < aMagnitude) not Magnitude>> between: min and: max ^self >= min and: [self <= max]
  23. 23. S.Ducasse 23 Date Subclass of Magnitude Date today < Date newDay: 15 month: 10 year: 1998 -> false
  24. 24. S.Ducasse 24 Date Date>>< aDate "Answer whether the argument, aDate, precedes the date of the rec." year = aDate year ifTrue: [^day < aDate day] ifFalse: [^year < aDate year]
  25. 25. S.Ducasse 25 Date Date>>= aDate "Answer whether the argument, aDate, is the same day as the receiver. " self species = aDate species ifTrue: [^day = aDate day & (year = aDate year)] ifFalse: [^false] Date>>hash ^(year hash bitShift: 3) bitXor: day
  26. 26. S.Ducasse 26 What you should know • What is an abstract class? • What can we do with it?

×