The problem you have can be solved by Inheritence. Make a base Map class with overridable functions. If you need to, you can extend the Map class for specific behaviors. You don't need to "duplicate code" this way, since you can call a function called Foo()
from a child class which will ALSO call Foo()
from the parent class.
Should I use a specific class for each map behavior?
In my opinion, yes. If your maps have mostly similar behaviors except for a few things, you can and should use inheritance to your benefit. It's also great for organizing map behaviors and keeping you sane, and your code will look cleaner.
As DMGregory has noted, maps are usually JUST data, so creating a new class for a specific ordering of tiles and objects is not necessary. An array or an XML file can do that for you. Your Map class should ONLY be in charge of doing things with the data, not holding onto the data in the editor. You should have a separate class or file with your map data in it and hand it to your Map class, which will render it and control the update loop. Try not to let you map do too many things at once, though. Because of this, it may be pertinent to rename your Map
class to MapController
or something similar, so that it's clear what exactly it does. Then you can extend for specific behaviors beyond that like SwampController
or DesertController