Im not sure I follow your reasoning on why you shouldnt extend to specific monsters ?
you know, it looks good on the surface and in the code but I think you will learn it's not very practical at that level.say you had 50 different monster types... that select case is going to be huge and very unreadable. also, what if you didn't want your monster type hard coded, say you wanted them in non compiled external config files? How are you going to "new" that type?.... again you would have 50 case statements in that select case while I would not have any. what I would do is have a base class called TCharacter that TPlayer,TMonster,TNPC... extend from. then for TMonster and TNPC I would just use data statements to define them. for "Update"ing of a specific TMonster or TNPC type, it would be as simple as having function pointers defined inside those data types. With this I can easily add a whole new monster by adding a data statement or modifying the config file. Even better, defining the new monster in an external editor like the map editor...