added liskov substitution