The kludge feeling would be reduced if you BlitzMax implemented:
a) Method overloading
b) Derived functions that can return compatible derived types
This gives a compile error: "Overriding method differs by type".
So the derived type factory has to be called something else like CreateCity and you say:
Local city:T_City = T_City.CreateCity("Sydney", 3276207)
Whereas I'd like to say:
Local city:T_City = new T_City("Sydney", 3276207)
Also the derived type has no built-in way to pass parameters to its base type constructor so you end up having to implement yet another differently named method in each type for its descendents to set its parameters
Here T_Star is derived from T_Natural and happens to have the same parameters although it could have additional ones or even not have some but provide defaults. I regard it as duplication for T_Star to directly set the properties that it inherits from T_Natural. It should be possible to pass these to the super constructor in a minimal way.
I'd like to see something like the following in BlitzMax (based on C# syntax):
Add in that you might want constructors with various parameters and you start to write things like:
' Default empty constructor
Function CreateStar:T_Star()
' Constructor with Name, Pos, Vel, Colour, Mass
Function CreateStarNPVCM:T_Star(name:string, ...)
' Constructor with everything
Function CreateStarNPVCMRRR:T_Star(name:string, ...)
This is the area in which BlitzMax is weakest as a language with OO aspirations.
a) Method overloading
b) Derived functions that can return compatible derived types
Type T_Place Field Name:String Function Create:T_Place (name:String) Local obj:T_Place = New T_Place obj.Name = name Return obj End Function End Type Type T_City Extends T_Place Field Population:Int Function Create:T_City (name:String, population:Int) Local obj:T_City = New T_City obj.Name = name obj.population = population Return obj End Function End Type
This gives a compile error: "Overriding method differs by type".
So the derived type factory has to be called something else like CreateCity and you say:
Local city:T_City = T_City.CreateCity("Sydney", 3276207)
Whereas I'd like to say:
Local city:T_City = new T_City("Sydney", 3276207)
Also the derived type has no built-in way to pass parameters to its base type constructor so you end up having to implement yet another differently named method in each type for its descendents to set its parameters
' Star type - These guys shine and occasionally explode Type T_Star Extends T_Natural Function CreateStar:T_Star(name:String, pos:T_Pos, vel:T_Pos, colour:T_Colour, mass:Float, radius:Float, rot:Float, rotRate:Float) Local obj:T_Star = New T_Star obj.SetStarParms(name, pos, vel, colour, mass, radius, rot, rotRate) Return obj End Function Method SetStarParms(name:String, pos:T_Pos, vel:T_Pos, colour:T_Colour, mass:Float, radius:Float, rot:Float, rotRate:Float) super.SetNaturalParms(name, pos, vel, colour, mass, radius, rot, rotRate) End Method End Type
Here T_Star is derived from T_Natural and happens to have the same parameters although it could have additional ones or even not have some but provide defaults. I regard it as duplication for T_Star to directly set the properties that it inherits from T_Natural. It should be possible to pass these to the super constructor in a minimal way.
I'd like to see something like the following in BlitzMax (based on C# syntax):
' Star type - These guys shine and occasionally explode Type T_Star Extends T_Natural Method New(name:String, pos:T_Pos, vel:T_Pos, colour:T_Colour, mass:Float, radius:Float, rot:Float, rotRate:Float) : base(name, pos, vel, colour, mass, radius, rot, rotRate) ' Anything else you want to initialise here End Method End Type
Add in that you might want constructors with various parameters and you start to write things like:
' Default empty constructor
Function CreateStar:T_Star()
' Constructor with Name, Pos, Vel, Colour, Mass
Function CreateStarNPVCM:T_Star(name:string, ...)
' Constructor with everything
Function CreateStarNPVCMRRR:T_Star(name:string, ...)
This is the area in which BlitzMax is weakest as a language with OO aspirations.