Well, I would suggest making your classes subclasses of Window_Selectable or Window_Command rather than Window_Base. That way you'll have all of the methods you need and only have to change a few things. For the refresh, you might just want to keep track of the old index with a variable. Say, initialize the variable @old_index in the initialize method. Then you can use this check to see if index has changed:
if @old_index != self.index
refresh
@old_index = self.index
end
in the update method.