Hi
I needed some sort of polymorphism, but did not want to use inheritance and
methods because it needs heap allocation and I have quite small objects which
are created and destroyed frequently.
Finally I came out with setup which I was comfortable with, and here is example:
message.nim
type MessageType = enum msgHit, msgDeath, msgDayNight
type Message* = object
case messageType*: MessageType
of msgHit:
target*: string
hp*: int
of msgDeath:
died*: string
of msgDayNight:
isDay*: bool
# normally queue
var messages*: Message
proc hit*(target: string, hp: int): Message = Message(messageType: msgHit,
target: target, hp: hp)
proc death*(died: string): Message = Message(messageType: msgDeath, died:
died)
proc dayNight*(isDay: bool): Message = Message(messageType: msgDayNight,
isDay: isDay)
proc getTextHit(m: Message): string = "You hit " & m.target & " for " &
$m.hp & " HP."
proc getTextDeath(m: Message): string = m.died & " just died."
proc getTextDayNight(m: Message): string =
if m.isDay:
result = "The day has just begun."
else:
result = "Beware! Night is coming."
proc getText*(m: Message): string =
case m.messageType:
of msgHit:
result = getTextHit(m)
of msgDeath:
result = getTextDeath(m)
of msgDayNight:
result = getTextDayNight(m)
else:
result = "UNKNOWN MESSAGE"
main.nim
from message import dayNight, messages, getText
# game time system
proc informAboutDay() =
messages = dayNight(isDay = true)
# player informer
proc update() =
echo( getText(messages) )
when isMainModule:
informAboutDay()
update()
[snippet](https://glot.io/snippets/en6lyc2oyi)
It is simple, it is clear but it is very verbose. What would you suggest to
preserve merits while allowing addition of new MessageTypes easier. Currently
it consist in:
1. Add message type in MessageType
2. Add "of" condition in Message
3. Add "of" in getText
4. Provide constructor
5. Provide handler
Also I would not like to solve this problem introducing another overly
complicated layer (like not simple templates for instance).
All suggestions appreciated.
Regards
Michal
"Very bad coder." \- You have been warned!