Conceitos de Orientação a Objetos – Parte 6 de 6

Interfaces
O princípio de herança nem sempre se aplica a todas as classes que possuem características comuns. Uma pessoa é capaz de Andar, assim como um carro é capaz de andar. Nem por isso eles fazem parte de algum material comum. No seu sistema você pode ter que se deparar com situações parecidas.
Você pode, por exemplo, criar um agendador de tarefas programadas que servirá para mandar uma mensagem por e-mail diariamente para todos os clientes da loja. De forma semelhante, diariamente ele também pode iniciar uma tarefa que verifica se todos os servidores estão online.
Perceba que você pode estar lidando aqui com objetos de duas classes diferentes: MensagemPromocional e VerificadorDeConectividade. As duas classes não possuem relação nenhuma a não ser pelo fato de que as duas serão manipuladas por um mesmo objeto Agendador.
O conceito de interfaces começa a ser entendido pelo que o próprio nome diz: Interface a forma em que a via de comunicação precisa tomar para estabelecer contato com o destinatário. Uma tomada comum possui uma interface que vai determinar o tipo de plug que um fio deve possuir caso queira instalar-se nela. Se o plug não for compatível com a interface da tomada, ele vai precisar ser adaptado. Existe a interface de dois pinos, a interface de duas placas de cobre, e a interface 2p+T que inclui um terceiro pino para o fio-terra, para não citar ainda outras interfaces. Se o plug em questão não implementar a interface exigida pela tomada, ele não vai conseguir se plugar a menos que utilize um adaptador que implemente esta interface.
E através desta interface você é capaz de ligar um número variado de equipamentos que possuam plugs que a implementem. Desde forno elétrico, fogão, geladeira, televisor, aparelho de som, equipamentos de ginástica, compuadores, carregadores de celular, etc. Consegue enxergar a dimensão?
Assim também é na OOP. As classes não são obrigadas a herdarem umas das outras para serem semelhantes. Uma Interface pode ser criada, que defina todas as operações comuns que as classes que a implementem precisem ter, e então basta implementá-las nas classes para que elas possam ser plugadas por outras.
E é aí que a diversão do polimorfismo realmente começa. Digamos que você tenha uma interface ITarefaAgendada que implemente um método ExecutarTarefa. Implemente esta interface nas classes MensagemPromocional e VerificadorDeConectividade, assim ambos precisarão pussuir o método ExecutarTarefa. Imagine que o método quando o Agendador disparar, irá procurar por todas as terefas agendadas e em cada uma irá disparar o método ExecutarTarefa. Isso tudo sem saber (e nem ligar) se a tarefa é uma MensagemPromocional ou um VerificadorDeConectividade.
Agora sim, você está começando a compreender o grande universo do polimorfismo.