Information Hiding in modules!

BlitzMax Forums/BlitzMax Tutorials/Information Hiding in modules!

Dreamora(Posted 2005) [#1]
Heureka, I finally did it :)

Thanks to MasterK and his postings on Java and Interfaces on the german boards I remembered something I had some time back in studies that helped me to get implementation hiding into Blitz Max modules



Here is the solution, that only exports TStack from the module.



Modulsource:


Strict

Module datastructure.stack


Private

' Stack Implementation

Type TStack_Element
	Field _element:Object
	Field _connected:TStack_Element
	
	Function create:TStack_Element( _elem:Object )
		' create a TStack_Element
		
		Local temp:TStack_Element	= New TStack_Element
		If _elem = Null
			Throw "No element given"
		EndIf
		
		temp._element				= _elem
		Return temp
		
	End Function
	
	Method Delete()
		_element 	= Null
		_connected 	= Null
	End Method
End Type

Type TStack_Imp Extends TStack
'	Implementation of stack
	Field _top:TStack_Element
	Field _count:Int
	
	Function create:TStack_Imp()
		Local temp:TStack_Imp	= New TStack_Imp
		Return temp
	End Function
	
	Method push( _elem:Object )
		Local temp:TStack_Element
			
		temp			= TStack_Element.create( _elem )	
		temp._connected	= _top
		_top			= temp
		_count 			:+ 1

	End Method
	
	Method pop:Object ()
		Local ret:Object
		
		If _count > 0
			_count			:- 1
			ret				= 	_top._element
			_top			=	_top._connected
		EndIf
		Return ret
	End Method
	
	Method top:Object ()
		Return _top._element
	End Method
	
	Method count:Int ()
		Return _count
	End Method
	
	Method clear()
	
		While count() > 0
			pop()
		Wend
		
	End Method
End Type


Public
' Module Export


Type TStack

	Function create:TStack()
		Local temp:TStack = TStack_Imp.create()
		Return TStack( temp )
	End Function

	Method push( _elem:Object ) Abstract
	
	Method pop:Object () Abstract
	
	Method top:Object () Abstract
	
	Method count:Int () Abstract
	
	Method clear() Abstract

End Type



Testsamplesource:

Strict

Local stack:TStack	= TStack.create()
Local i:Int

For i = 1 To 2000
	stack.push( String("Test "+i) )
Next

Print "elements in stack: " + stack.count()
Print "first element: " + String( stack.pop() )

flushmem
Print "used memory: " + MemAlloced()

stack.clear
FlushMem
Print "used memory: " + MemAlloced()
Print "elements in stack: " + stack.count()

Delay 10000
End



Mark Tiffany(Posted 2005) [#2]
Hope you don't mind, but I've created a simple tutorial in the BlitzWiki using your code to (start) describing this.


Perturbatio(Posted 2005) [#3]
nice :)


Dreamora(Posted 2005) [#4]
Mark Tiffany: Sure, no problem