Любой язык с экстенсионной, а не интенциональной типизацией допускает такие конструкции.
Например, в RDF два источника могут заявлять о веб-ресурсе, которые полностью конфликтуют, или на языке «утиного типа» объект может иметь все характеристики двух иначе не связанных типов.
Языки расширения классифицируют объекты по их свойствам - если у них есть зубцы, это вилка, если у них есть ручка и чаша, это ложка, если у них есть и зубцы, и чаша, это и вилка, и ложка.
Разница между такими языками и ориентированными на классы интенциональными языками, такими как C ++ / Java / C #, к которым чаще всего применяется UML, заключается в том, что вам не нужен класс spork для определения вещей, которые являются как ложками, так и вилками - будь то принадлежность к классификатору определяется тем, соответствуют ли они требованиям классификатора.