Error trying to create an extended type

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

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

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


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

np oh soggy one :)

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

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:
Strict 
Graphics 800,600,0

Type ParentType
	Field id
	Field x#,y#
	Field xdir#, ydir#
	Field name$

	
	Function Create:ParentType(newname$, i)
		Local temp:ParentType = New ParentType
		temp.Init(newname$,i)
		Return temp
	End Function


	Method Init:ParentType(newname$, i)
		id = i
		x = Rnd(800)
		y = Rnd(600)
		name$ = newname$
		Local n = Rand(2)

		If n=1
			xdir = 1 
		Else
			xdir = -1
		End If

		n = Rand(2)
		If n=1
			ydir = 1 
		Else
			ydir = -1
		End If
		
	End Method
	
	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 = New YAxis
		temp.Init(newname$,i)
		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
		
	FlushMem ; Flip
Wend
End


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

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.

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


Greetings Puppies,

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

Peace,

Jes