OOP dilemna

BlitzMax Forums/BlitzMax Programming/OOP dilemna

JoshK(Posted 2006) [#1]
I have these classes:

Entity
Light Extends Entity
PointLight Extends Light
SpotLight Extends Light

Then I have a list of Light classes that affect a certain entity. I want to get some information about the light that is specific to one of the light subclasses, like the cone angle of the spotlight. I can't get at it easily, because the cone angle parameter is part of the "SpotLight" type, and I have the handle to the Super "Light" type.

I can easily solve this by moving the coneangle field from the "SpotLight" type to the Super "Light" type, but it's not very nice.

Any suggestions?


Azathoth(Posted 2006) [#2]
Check if it casts to SpotLight?


N(Posted 2006) [#3]
What Azathoth means:
Local spot:SpotLight = SpotLight(YourLight)
If spot Then
    Print "Is a spotlight"
EndIf


I'd prefer to place a class ID in the light entity to check before casting just because it would save time.

However, I'm more in favor the component-object entity system than the current means of just extending things each time I need some new functionality. Instead of doing that, I just add a new component to its list of components and the functionality is added, so it's like I can have multiple inheritance rather than extending a single existing type.

There's a crude example of this in my code archive entries and it's covered in Game Programming Gems 5.


Grey Alien(Posted 2006) [#4]
That's an interesting way to test a type. In Delphi you can say "If Yourlist is Spotlight" which is pretty cool. Another way is to have a tag in the Light field which defines the type of type it is, then you can just query that later on.


Dreamora(Posted 2006) [#5]
Would suggest the second way as well.

Create a field _type:String in your entity class and any extended class assings usefull data to that in its default constructor (method new() )


Tibit(Posted 2006) [#6]
I'm not sure if this solves your problem but it might. You can loop any object type in your Tlist.

'Loop all SpotLights in your LightList
For local Light:SpotLight = Eachin LightList
     If Light.Radius > Light.Cone
       'do what you want
     Endif
Next
'Loop all PointLights in your LightList
For local Light:PointLight = Eachin LightList
     If Light.PointCenter < Z
       'Do something :)
     Endif
     'In this case Light is always of the Pointlight type.
Next