В Java, например, я бы решал это дело с помощью интерфейсов, а не абстрактных классов. Ибо класс может реализовывать много интерфейсов, а расширять только один класс. Так, например, класс Гитара может реализовывать интерфейс Музыкальный инструмент, у которого есть метод Играть, интерфейс Оружие с методом Бить, и так далее.