Error trying to create an extended type

BlitzMax Forums/BlitzMax Beginners Area/Error trying to create an extended type

SoggyP(Posted 2005) [#1]
Greetings Puppies,

I'm new to this oop stuff and need a little guidance, and couldn't find the answer elsewhere. Please see code below:

Strict 
Graphics 800,600,0

Type ParentType
	Field id
	Field x#,y#
	Field xdir#, ydir#
	Field name$
	
	Function Create:ParentType(newname$)
		Local temp:ParentType = New ParentType
		temp.x = Rnd(800)
		temp.y = Rnd(600)
		temp.name$ = newname$
		Local n 
		n = Rand(2)
		If n=1 Then 
			temp.xdir = 1 
		Else
			temp.xdir = -1
		End If

		n = Rand(2)
		If n=1 Then 
			temp.ydir = 1 
		Else
			temp.ydir = -1
		End If
		
		Return temp
	End Function
	
	Method Move()
		x:+xdir
		y:+ydir
		If x<0 Or x>800 Then xdir:*-1
		If y<0 Or y>600 Then ydir:*-1
	End Method
End Type

Type YAxis Extends ParentType
		
	Method Move()
		y:+ydir
		If y<0 Or y>600 Then ydir:*-1
	End Method
End Type

Local y_axis:YAxis = YAxis.Create("Y Only : " + Rand(100))
Local myinstance:ParentType = ParentType.Create("X and Y : " + Rand(100))
			
While Not KeyDown(key_escape)
	Cls
	myinstance.move
	DrawText myinstance.name, myinstance.x, myinstance.y
	Flip
Wend
End


On compilation it tells me it is 'unable to convert from parenttype to Yaxis'. I understand in one respect, ie, because 'Create()' is trying to return an object of parenttype not YAxis, but I thought the point of inheritance was that it would allow this sort of behaviour. I can't even seem to cast it.

Any suggestions?

Peace,

Jes


Perturbatio(Posted 2005) [#2]
you are trying to assign a ParentType instance to a YAxis type, you can either cast it as a YAxis, or make a new Create function for the child type:


Strict 
Graphics 800,600,0

Type ParentType
	Field id
	Field x#,y#
	Field xdir#, ydir#
	Field name$
	
	Function Create:ParentType(newname$)
		Local temp:ParentType = New ParentType
		temp.x = Rnd(800)
		temp.y = Rnd(600)
		temp.name$ = newname$
		Local n 
		n = Rand(2)
		If n=1 Then 
			temp.xdir = 1 
		Else
			temp.xdir = -1
		End If

		n = Rand(2)
		If n=1 Then 
			temp.ydir = 1 
		Else
			temp.ydir = -1
		End If
		
		Return temp
	End Function
	
	Method Move()
		x:+xdir
		y:+ydir
		If x<0 Or x>800 Then xdir:*-1
		If y<0 Or y>600 Then ydir:*-1
	End Method
End Type



Type YAxis Extends ParentType
		
	Method Move()
		y:+ydir
		If y<0 Or y>600 Then ydir:*-1
	End Method
	
	Function Create:YAxis(newname$)
		Return YAxis(Super.Create(newname$))
	End Function
End Type



Local y_axis:YAxis = YAxis.Create("Y Only : " + Rand(100))
Local myinstance:ParentType = ParentType.Create("X and Y : " + Rand(100))
			
While Not KeyDown(key_escape)
	Cls
	myinstance.move
	DrawText myinstance.name, myinstance.x, myinstance.y
	Flip
Wend
End



SoggyP(Posted 2005) [#3]
Greetings Puppies,

Thanks, oh pert one :0) I was hoping to avoid the necessity of the second Create() command, but if that's the way, then that's the way.

Thanks.

Jes


Perturbatio(Posted 2005) [#4]
np oh soggy one :)


SoggyP(Posted 2005) [#5]
Greetings Puppies,

Hmmm, it doesn't seem to work.

Please see updated code below.

Strict 
Graphics 800,600,0

Type ParentType
	Field id
	Field x#,y#
	Field xdir#, ydir#
	Field name$
	
	Function Create:ParentType(newname$, i)
		Print "Arrived at Create"
		
		Local temp:ParentType = New ParentType
		temp.id = i
		temp.x = Rnd(800)
		temp.y = Rnd(600)
		temp.name$ = newname$
		Local n 
		n = Rand(2)
		If n=1 Then 
			temp.xdir = 1 
		Else
			temp.xdir = -1
		End If

		n = Rand(2)
		If n=1 Then 
			temp.ydir = 1 
		Else
			temp.ydir = -1
		End If
		
		Return temp
	End Function
	
	Method Move()
		x:+xdir
		y:+ydir
		If x<0 Or x>800 Then xdir:*-1
		If y<0 Or y>600 Then ydir:*-1
	End Method
	
	Method Show()
		SetAlpha(Float id/100)
		DrawText name, x, y
	End Method
End Type

Type YAxis Extends ParentType

	Function Create:YAxis(newname$,i)
		Local temp:YAxis
		temp = YAxis(Super.Create(newname$,i))
		If temp = Null Then
			Print "Temp not created!!"
			DebugStop
		End If
		Return temp
	End Function

	Method Move()
		y:+ydir
		If y<0 Or y>600 Then ydir:*-1
	End Method

	Method Show()
		SetAlpha(Float id/100)
		DrawText name, x, y
	End Method

End Type

Local parents:TList
Local i

parents = CreateList()

Local myinstance:ParentType
Local y_axis:YAxis

For i = 1 To 100
	myinstance:ParentType = ParentType.Create("X and Y : " + i, i)
	parents.addlast(myinstance)
Next

For i = 1 To 100
	y_axis:YAxis = YAxis.create("Y Only : " + i,i)
	If y_axis = Null Then
		Print "Y Axis Not Created!!"
		DebugStop
	End If
	parents.addlast(y_axis)
Next

SetBlend(alphablend)
			
While Not KeyDown(key_escape)
	Cls
	For myinstance = EachIn parents
		myinstance.move
		myinstance.show
	Next
	
	For y_axis = EachIn parents
		y_axis.move
		y_axis.show
	Next
	
	FlushMem ; Flip
Wend
End


Any suggestions?

Peace,

Jes


FlameDuck(Posted 2005) [#6]
First of all, you can't use "Super" from a static context - the compiler should have thrown an error!

Secondly, I'm not sure you're allowed to downcast like that.

Instead try something like this:



SoggyP(Posted 2005) [#7]
Greetings Puppies,

Thanks Mikkel, I'd just done exactly that right down to the function called init :0) I just came back to update to say 'Problem Solved'

Ta anyway,

Peace,

Jes


Dreamora(Posted 2005) [#8]
One thing not mentioned:

You can assign YAxis to ParentType but not vice versa.
Why? Because YAxis is an extended of Parent Type so it contains the full ParentType which can be assigned to a parentType Structure.

But ParentType does not contain the full YAxis which is the reason this assignement is illegal.


BlitzSupport(Posted 2005) [#9]
Using Soggy's original code and changing only the YAxis line...

Strict 
Graphics 800,600,0

Type ParentType
	Field id
	Field x#,y#
	Field xdir#, ydir#
	Field name$
	
	Function Create:ParentType(newname$)
		Local temp:ParentType = New ParentType
		temp.x = Rnd(800)
		temp.y = Rnd(600)
		temp.name$ = newname$
		Local n 
		n = Rand(2)
		If n=1 Then 
			temp.xdir = 1 
		Else
			temp.xdir = -1
		End If

		n = Rand(2)
		If n=1 Then 
			temp.ydir = 1 
		Else
			temp.ydir = -1
		End If
		
		Return temp
	End Function
	
	Method Move()
		x:+xdir
		y:+ydir
		If x<0 Or x>800 Then xdir:*-1
		If y<0 Or y>600 Then ydir:*-1
	End Method
End Type

Type YAxis Extends ParentType
		
	Method Move()
		y:+ydir
		If y<0 Or y>600 Then ydir:*-1
	End Method
End Type

Local y_axis:YAxis = YAxis (ParentType.Create("Y Only : " + Rand(100)))
Local myinstance:ParentType = ParentType.Create("X and Y : " + Rand(100))
			
While Not KeyDown(key_escape)
	Cls
	myinstance.move
	DrawText myinstance.name, myinstance.x, myinstance.y
	Flip
Wend
End



SoggyP(Posted 2005) [#10]
Greetings Puppies,

Excellent, ta James. That actually makes sense, doesn't it ;0)

Peace,

Jes