Factoring e herança em C ++

O conceito de herança e, portanto, factoring, em C ++ permite que uma classe para herdar as propriedades de uma classe base. Herança tem um número de fins-o principal benefício da herança é a capacidade de destacar a relação entre classes. Este é o chamado É UMA relacionamento - um Forno de micro-ondas is_a Forno e coisas assim.

Factoring é uma grande coisa se você fizer as correlações corretas. Por exemplo, o forno de microondas contra o relacionamento forno convencional parece natural. Afirmam que microondas é um tipo especial de torradeira, e você está indo para o problema. É verdade, ambos fazem coisas quente, ambos usam eletricidade, e ambos são encontrados na cozinha, mas a semelhança termina aí - um forno de microondas não pode fazer torradas e uma torradeira não pode fazer nachos.

Identificando as classes inerentes a um problema e desenhando as relações correctas entre estas classes é um processo conhecido como factoring. (A palavra está relacionada com a aritmética que você foi forçado a fazer na escola: factoring os denominadores menos comuns, por exemplo, 12 é igual a 2 vezes 2 vezes 3.)

Veja como você pode usar a herança para simplificar seus programas usando um exemplo de conta bancária. Suponha que você foi convidado a escrever um programa de banco simples que implementou o conceito de uma conta poupança e uma conta corrente.

programadores orientados a objetos vieram acima com uma maneira concisa para descrever os pontos mais importantes de uma classe em um desenho. o checagem e Poupança classes são mostrados nesta figura. (Esta é apenas uma das várias maneiras de expressar graficamente a mesma coisa.)

classes Independentes & lt; i>Checkinglt; / i> e lt; i> Savings.lt; / i>
aulas independentes checagem e Poupança.

Para ler esta figura e as outras figuras, lembre-se o seguinte:

  • A caixa grande é a classe, com o nome da classe no topo.

  • Os nomes em caixas são funções de membro.

  • Os nomes não em caixas são membros de dados.

  • Os nomes que se estendem parcialmente para fora das caixas são publicamente membros- acessível que é, esses membros podem ser acessados ​​por funções que não são parte da classe ou qualquer dos seus descendentes. Os membros que estão completamente dentro da caixa não são acessíveis de fora da classe.

  • A seta grossa representa o É UMA relação.

  • A seta representa o fina TEM UM relação.

UMA Car Vehicle is_a, mas um Carro HAS_A Motor.

Você pode ver na primeira figura que o checagem e Poupança classes têm muito em comum. Por exemplo, ambas as classes têm uma retirada() e depósito() função de membro. Uma vez que as duas classes não são idênticos, no entanto, que eles devem permanecer como classes separadas. (Em um aplicativo de banco de vida real, as duas classes seria um bom negócio mais diferente do que neste exemplo.) Ainda assim, deve haver uma maneira de evitar esta repetição.

Você poderia ter uma dessas classes herdar de outro. Poupança tem mais membros do que Verificando, assim que você poderia deixar Poupança herdam Verificação. Este arranjo é mostrado nesta próxima figura.

o Poupança classe herda todos os membros. A classe é completado com a adição do membro de dados noWithdrawals e substituindo a função retirada(). Você tem que substituir retirada() porque as regras para retirar dinheiro de uma conta de poupança são diferentes daqueles para retirar dinheiro de uma conta corrente.

& lt; i>Savingslt; / i> implementado como uma subclasse de lt; i> Checking.lt; / i>
Poupança implementado como uma subclasse de Verificação.

embora permitindo Poupança herdam checagem é laborsaving, não é completamente satisfatória. O principal problema é que, como o peso listado na minha carteira de motorista, ele deturpa a verdade. Esta relação de herança implica que uma conta poupança é um tipo especial de conta corrente, o que não é.

Tais distorções são confusas para o programador, tanto hoje e de amanhã. Um dia, um programador familiarizado com nossos truques de programação terá que ler e entender o nosso código faz. declarações enganosas são difíceis de conciliar e entender.

Além disso, tais distorções pode levar a problemas no caminho. Suponha, por exemplo, que o banco alterar as suas políticas com relação a contas correntes. Diga-decide cobrar uma taxa de serviço de conta corrente somente se o saldo mínimo mergulhos abaixo de um determinado valor durante o mês.

Uma mudança como essa pode ser facilmente manuseado com mudanças mínimas para a classe Verificação. Você vai ter que adicionar um novo membro de dados para a classe checagem para acompanhar o saldo mínimo durante o mês. Vamos sair em um membro e chamá-lo minimumBalance.

Mas agora você tem um problema. Porque Poupança herda de Corrente, poupança recebe este novo membro de dados também. Ele não tem nenhum uso para esse membro, porque o saldo mínimo não afeta contas de poupança, de modo que apenas se senta lá. Lembre-se que cada objeto conta corrente tem esse adicional minimumBalance membro. Um membro de dados extra pode não ser um grande negócio, mas acrescenta mais confusão.

Alterações como essa acumular. Hoje é um membro de dados adicional - amanhã é uma função de membro alterado. Eventualmente, a conta poupança da classe está carregando um monte de bagagem extra que só é aplicável a contas correntes.

Agora o banco volta e decide mudar algumas economias política de conta. Isso requer que você modificar alguma função no Verificação. Alterações como essa na classe base propagar automaticamente para a subclasse a menos que a função já está substituído na subclasse Poupança.

Por exemplo, suponha que o banco decide dar torradeiras para cada depósito na conta corrente. Sem o banco (ou seus programadores) sabendo que, depósitos para contas correntes, automaticamente resultará em doações torradeira. A menos que você está muito cuidado, muda para checagem inesperadamente pode aparecer em Poupança.

Como você pode evitar esses problemas? alegando que checagem é um caso especial de Poupança faz mudanças, mas não resolve o nosso problema. O que você precisa é de uma terceira classe (chamá-lo Conta, apenas para sorrisos) que incorpora as coisas que são comuns entre checagem e Poupança, como mostrado aqui.

Basing & lt; i>Checkinglt; / i> e lt; i> Savingslt; / i> em comum lt; i> Accountlt;. / i> classe
Basing checagem e Poupança em comum Conta classe.

Como é que a construção de uma nova conta de resolver os problemas? Em primeiro lugar, a criação de um novo Conta classe é uma descrição mais precisa do mundo real (seja lá o que é). Claro, não há realmente algo conhecido como uma conta. contas de poupança e contas correntes são casos especiais deste conceito mais fundamental.

Além disso, a classe Poupança é isolado de mudanças para a classe checagem (e vice versa). Se os institutos bancários uma mudança fundamental a todas as contas, você pode modificar Conta, e todas as subclasses herdará automaticamente a alteração. Mas se o banco muda sua política apenas para contas correntes, você pode modificar apenas o checagem classe de conta sem afetar Poupança.

Este processo de abate de propriedades comuns de classes semelhantes é a essência de factoring classe.

Factoring é legítima apenas se a relação de herança corresponde à realidade. Factoring em conjunto uma classe Rato e Controle de video game porque eles são tanto de hardware dispositivos apontadores é legítimo. Factoring em conjunto uma classe Rato e Exibição porque ambos fazem chamadas de sistema operacional de baixo nível não é.

menu