computer program computer programming computer science generalization has-a knowledge representation liskov substitution principle object-oriented design object-oriented programming specialization subclass subsumption subtype superclass