Geralmente, tento descrever a programação orientada a objetos usando exemplos do mundo real.
Por exemplo, posso dizer que uma classe chamada Vehicle
descreve as coisas mínimas que um veículo é. Vou pedir à pessoa para me dizer o que ela pensa que é um veículo. Às vezes eles dizem coisas como "Bem, como um carro ou um caminhão", e eu aceno e concordo com eles. Então perguntarei quais são as diferenças entre um carro e um caminhão. Algumas vezes mencionam tamanho, outras vezes o propósito e outras coisas.
Depois, peço que eles se esqueçam de um carro ou caminhão e peço que continuem descrevendo um veículo:
"Oh, bem, se move"
"Possui operador ou motorista"
etc ...
Logo, sabemos o que é um Veículo e eu disse que em OOP definiríamos um veículo e, por uma questão de argumento, ele pode se mover e dar a ele um tipo de motorista. Então eu vou perguntar, ok, então o que um carro tem?
"Portas"
"Janelas"
E então um caminhão ....
"Portas" "janelas" "Mais rodas!"
Logo, após muita discussão, a outra pessoa geralmente identificou:
1) O que constitui um veículo
2) O que constitui um carro
3) O que constitui um caminhão
4) O que constitui um avião.
Tudo sem nenhum detalhe técnico. Dividimos as propriedades de cada uma nas áreas corretas. Eles entendem a herança ("Sim, um carro é um veículo, um caminhão é um veículo, mas um carro não é um caminhão, é SIMPLES, duh!").
Eles até entendem o polimorfismo: "Claro, eles basicamente fazem o mesmo, mas isso pode ser um pouco diferente". Podemos falar sobre comportamento e onde isso deve estar na nossa árvore de objetos.
Dependendo da sua formação e formação, alguns conseguem mais rápido que outros. Mas quando eu comparo OOP a objetos da vida real, a maioria das pessoas sempre o entende. De fato, encontrei em conversas com pessoas não técnicas coisas em que nunca havia pensado. Os veículos não precisam ser tripulados, por exemplo (drones), mas um programador teria pensado no operador do veículo como uma propriedade dele? Não estou dizendo que é certo ou errado mencionar um operador, mas isso nos leva a pensar sobre o que estamos modelando e o que estamos tentando alcançar quando desenvolvemos software.
Agora, especialização parcial de modelos, por outro lado .... :)