add two interface
add two base class
refactor