using abstract classes and avoid some unnessaccery method interfaces
code struct improvement