Constructors and Inheritance

BlitzMax Forums/BlitzMax Beginners Area/Constructors and Inheritance

assari(Posted 2006) [#1]
Blitzmax does not allow me to have one constructor and cast it down to its child.
Strict
Type Father
	Field Name:String
	
	Function create:Father(s:String)
		Local f:Father=New Father
		f.Name=s
		Return f
	End Function

	Method display()
		Print "Name:"+Name+" Type:Father"
	End Method

End Type

Type son Extends Father

	Method display()
		Print "Name:"+Name+" Type:Son"
	End Method
	
End Type


Type daughter Extends Father

	Method display()
		Print "Name:"+Name+" Type:Daughter"
	End Method
	
End Type

Local Man:Father=Father.Create("John")
Man.Display()
Local Boy:Son=Son(Father.Create("Jack"))
Boy.Display()
Local Girl:Daughter=Daughter(Father.Create("Jill"))
Girl.Display()

End

or am I doing something wrong?


Dreamora(Posted 2006) [#2]
You can't cast down the inheritance tree, only up (from son to father, daughter to father).

What you would want to use is:
Strict
Type Father
	Field Name:String
	
	Function create:Father(s:String)
		Local f:Father=New Father
		f.Name=s
		Return f
	End Function

	Method display()
		Print "Name:"+Name+" Type:Father"
	End Method

End Type

Type son Extends Father

	Function create:Father(s:String)
		Local t:Son=New Son
		t.Name	= s
		Return Father(t)
	End Function
	
	Method display()
		Print "Name:"+Name+" Type:Son"
	End Method
	
End Type


Type daughter Extends Father
	Function create:Father(s:String)
		Local t:daughter=New daughter
		t.Name	= s
		Return Father(t)
	End Function
	
	Method display()
		Print "Name:"+Name+" Type:Daughter"
	End Method
	
End Type

Local Man:Father=Father.Create("John")
Man.Display()

Local Boy:Father=Son.Create("Jack")
Boy.Display()
Local Girl:Father=daughter.Create("Jill")
Girl.Display()

End





Reason:

Son is extended from Father, so Son shares the properties with his father. Casting no problem.

But Father does not share Son properties, so casting this way is not possible.

But as you see above, the extended types method is called if you call display on something that was casted from an extended type to father.


assari(Posted 2006) [#3]
Interesting. Thanks a bunch


Nelvin(Posted 2006) [#4]
You surely can downcast the hierarchy, you just have to do it more explicit because by downcasting your objects may or may not be of the required types.

Local Man:Father = new Son
Local Boy:Son = Son(Man)

Now Boy holds a reference to a Son instance

Local Girl:Daughter = Son(Man)
Now Girl is Null because Man is only a Father and a Son but not a Daughter.


Dreamora(Posted 2006) [#5]
Thats what I said, not?

You can cast from Son to Father (and that than back), but you can't cast a Father to Son if it was not a Son originally.


Nelvin(Posted 2006) [#6]
Yeah you're right - just wanted to clarify that you can work with base classes and cast them down to their more concrete types with explicit casts if they are really those kinds of objects - whereas you can always be sure an upcast to the parent classes is always possible.

I thought what the original poster maybe wants to do is f.i. managing a list of entities and have a few special cases where he has to check the concrete type and only act on some of the possible derivations.
But yes, we can't cast a reference to anything the referenced object instance isn't at any stage of its typehierarchy.