Conformidade de tipo e comportamento fechado
Classe X Tipo “Uma classe é uma implementação de um tipo, que é a visão abstrata ou externa de uma classe” “Um tipo pode ser implementado sob a forma de diversas classes. Tendo cada classe seu próprio desenho interno” Conformidade de tipo
ÁrvoreUtilizandoMatriz Por exemplo: <<type>> Grupo {abstrato} <<class>> ÁrvoreUtilizandoID acrescentarElementos (novoElemento) {abstrato} <<implements>> <<class>> ÁrvoreUtilizandoMatriz <<type>> Árvore acrescentarElementos (novoElemento) {abstrato} <<implements>> Conformidade de tipo
[semanticamente não tem sentido] Embora um tipo represente a visão externa de uma classe, o conceito de subtipo é distinto do conceito de subclasse! Por exemplo: Elefante herda de Retângulo {sintaticamente pode ser válido} [semanticamente não tem sentido] Conformidade de tipo
Princípio da Conformidade de Tipo: “Se S é subtipo real de T, então S deve se conformar a T. Ou seja, um objeto de tipo S pode ser provido em qualquer contexto no qual um objeto de tipo T seja esperado, e a exatidão será preservada quando qualquer operação de acesso do objeto for executada.” Conformidade de tipo
Por exemplo: Círculo é um subtipo de Elipse! Qualquer objeto que for um círculo será também uma elipse. “em um desenho OO sadio, o tipo de cada classe deve conformar-se ao tipo de sua superclasse.” [contrariando a definição!] Conformidade de tipo
Como assegurar a Conformidade de Tipo? A invariante da subclasse deve ser, no mínimo, tão forte quanto a da superclasse. Ex: Retângulo >> w1=w2 and h1=h2 Quadrado >> w1=w2 and h1=h2 and w1=h2 Conformidade de tipo
e … deve satisfazer também: Toda operação da superclasse deve ter uma correspondente na subclasse com mesmo nome e assinatura A pré-condição de qq operação não deve ser mais forte do que da superclasse (princípio da contravariação) A pós-condição de qq operação deve ser, no mínimo, tão forte quanto a operação da superclasse (princípio da covariação) Conformidade de tipo
Ex de conformidade de tipo: Funcionário CalcularBônus (avaliaçãoDeDesempenho, out %DeBônus) Gerente CalcularBônus (avaliaçãoDeDesempenho, out %DeBônus) Conformidade de tipo
invariantes: Funcionário >> nivelDeFormação > 0 Gerente >> nivelDeFormação > 20! Operações correspondentes (ok) Pré-condição: avaliaçãoDeDesempenho: 0 a 5 para Gerente e Funcionário 0 a 8 maior (mais fraca) para Gerente! Pós-condição: %DeBônus: 0% a 10% para Gerente e Funcionário 0% a 6% menor (mais forte) para Gerente Conformidade de tipo
Resumo dos requisitos para conformidade de tipo: Para S ser um subtipo verdadeiro de T: O espaço-estado de S deve ter as mesmas dimensões de T Nas dimensões que S e T compartilham, o espaço-estado de S deve ser igual a, ou residir dentro do espaço-estado de, T S.op deve ter o mesmo nome que T.op Conformidade de tipo
A pré-condição de S.op deve ser igual ou mais fraca do que de T.op A lista de argumentos da assinatura formal de S.op deve corresponder à de T.op A pré-condição de S.op deve ser igual ou mais fraca do que de T.op A pós-condição de S.op deve ser igual ou mais fraca de T.op Conformidade de tipo
O princípio do Comportamento Fechado: “em uma hierarquia de herança baseada em tipo/subtipo, a execução de qualquer operação em um objeto da classe C – incluindo as operações herdadas de suas superclasses – deverá obedecer à invariante de classe de C.” Conformidade de tipo
Mover (distância: comprimento) Caso 1 (sem problemas!) mover tr1: Polígono Mover (distância: comprimento) Conformidade de tipo
Caso 2 (com problemas!) ? acrescentarVértice tr1: Polígono (novoVértice: Ponto) Conformidade de tipo
Solução: Evitar a herança de acrescentarVértice Suprimir acrescentarVértice de forma que ela não tenha qualquer efeito Estar preparado para reclassificar Triângulo como Quadrilátero (se for admissível pela aplicação) Conformidade de tipo