Factoring y herencia en c ++

El concepto de herencia, y por lo tanto la factorización, en C ++ permite a una clase a heredar las propiedades de una clase base. La herencia tiene un número de purposes- el principal beneficio de la herencia es la capacidad de señalar la relación entre las clases. Este es el llamado ES UN relación - una Horno de microondas Horno ES_UN Y cosas como esa.

Video: Herencia y Polimorfismo en c++

El factoraje es una gran cosa si usted hace las correlaciones correctas. Por ejemplo, el microondas frente a la relación horno convencional parece natural. Microondas afirmar que es un tipo especial de la tostadora, y que está en dificultades. Es cierto que ambos hacen cosas caliente, ambos usan la electricidad, y son ambos se encuentran en la cocina, pero la similitud termina ahí - un horno de microondas no puede hacer tostadas y una tostadora no puede hacer nachos.

La identificación de las clases inherentes a un problema y señalar las relaciones correctas entre estas clases es un proceso conocido como factorización. (La palabra está relacionada con la aritmética que se vieron obligados a hacer en la escuela primaria: factorizar los denominadores menos comunes, por ejemplo, 12 es igual a 2 veces 2 veces 3.)

He aquí cómo se puede utilizar la herencia para simplificar sus programas utilizando un ejemplo de cuenta bancaria. Suponga que se le pidió que escribir un programa de banco simple que implementa el concepto de una cuenta de ahorros y una cuenta de cheques.

programadores orientados a objetos han llegado con una forma concisa para describir los puntos más destacados de una clase en un dibujo. los Comprobación y Ahorros clases se muestran en esta figura. (Esto es sólo una de las varias formas de expresar gráficamente la misma cosa.)

clases independientes & lt; i & gt; Comprobación & lt; / i & gt; y & lt; i & gt;. Savings & lt; / i & gt; “/ & gt; & lt; / p & gt; & lt; div class =clases independientes Comprobación y Ahorros.

Para leer esta figura y las otras figuras, recuerde lo siguiente:

  • La caja grande es la clase, con el nombre de la clase en la parte superior.

  • Los nombres en las cajas son funciones miembro.

  • Los nombres no en cajas son miembros de datos.

    Video: Tutorial 7 - C++. Herencia

  • Los nombres que se extienden hasta la mitad de las cajas son accesibles públicamente miembros- es decir, estos usuarios pueden tener acceso a funciones que no son parte de la clase o cualquiera de sus descendientes. Aquellos miembros que están completamente dentro de la caja no son accesibles desde fuera de la clase.

  • Una flecha gruesa representa el ES UN relación.

    Video: Amistad y Herencia C++

  • Una flecha delgada representa el TIENE UN relación.

UN Vehículo automóvil ES_UN, sino una Motor de coche HAS_A.

Se puede ver en la figura que la primera Comprobación y Ahorros clases tienen mucho en común. Por ejemplo, ambas clases tienen una retirada() y depositar() función miembro. Debido a que las dos clases no son idénticos, sin embargo, deben permanecer como clases separadas. (En una aplicación bancaria en la vida real, las dos clases serían bastante más diferente que en este ejemplo). Aún así, debe haber una manera de evitar esta repetición.

Usted podría tener una de estas clases heredan de la otra. Ahorros tiene más miembros que Comprobación, por lo que podría dejar Ahorros heredar de Comprobación. Esta disposición se muestra en esta figura siguiente.

los Ahorros clase hereda todos los miembros. La clase se completa con la adición del miembro de datos noWithdrawals y reemplazando la función retirada(). Tiene que reemplazar retirada() porque las reglas para retirar dinero de una cuenta de ahorros son diferentes de aquellos para retirar dinero de una cuenta de cheques.

<i>Ahorro implementados como una subclase de <i>Comprobación.</i>“/ Gt;</div><div class=Ahorros implementado como una subclase de Comprobación.

A pesar de dejar Ahorros heredar de Comprobación se ahorran trabajo, no es completamente satisfactoria. El principal problema es que, al igual que el peso que aparece en el carnet de conducir, se falsea la verdad. Esta relación de herencia implica que una cuenta de ahorros es un tipo especial de cuenta de cheques, que no lo es.

Tales declaraciones falsas son confusas para el programador, tanto hoy y de mañana. Algún día, un programador familiarizado con nuestros trucos de programación tendrá que leer y entender lo que hace nuestro código. representaciones engañosas son difíciles de conciliar y comprender.

Además, este tipo de declaraciones falsas pueden dar lugar a problemas en el futuro. Supongamos, por ejemplo, que el banco cambia sus políticas con respecto a las cuentas de cheques. Digamos que decide cobrar una tarifa de servicio de cuentas corrientes sólo si el saldo mínimo cae por debajo de un valor dado durante el mes.

Un cambio de este tipo puede ser fácilmente manejado con cambios mínimos en la clase Comprobación. Vas a tener que añadir un nuevo miembro de datos a la clase Comprobación para realizar un seguimiento del saldo mínimo durante el mes. Vamos a salir en una extremidad y lo llaman balance minimo.

Pero ahora tiene un problema. Porque Ahorros hereda de Consultando su ahorro recibe este nuevo miembro de datos también. No tiene ningún uso para este miembro, porque el saldo mínimo no afecta a las cuentas de ahorro, por lo que sólo se sienta allí. Recuerde que cada objeto cuenta de cheques tiene este accesorio balance minimo miembro. Uno de los miembros de datos adicionales puede no ser un gran problema, pero añade más confusión.

Los cambios de este tipo se acumulan. Hoy en día se trata de un miembro de datos adicional - de mañana es una función miembro cambiada. Con el tiempo, la cuenta de ahorros de clase está llevando a una gran cantidad de exceso de equipaje que se aplica sólo a las cuentas corrientes.

Ahora el banco regresa y decide cambiar algunos ahorros representan la política. Para ello, debe modificar alguna función en Comprobación. Los cambios de este tipo en la clase base se propagan automáticamente a la subclase a menos que la función ya se anula en la subclase Ahorros.

Por ejemplo, supongamos que el banco decide regalar tostadoras para cada depósito en la cuenta de cheques. Sin el banco (o sus programadores) saberlo, depósitos a cuentas de cheques contribuya a abrir las donaciones tostadora. A menos que seas muy cuidadoso, los cambios en Comprobación puede aparecer inesperadamente en Ahorros.

¿Cómo puede evitar estos problemas? alegando que Comprobación es un caso especial de Ahorros cambios, pero no resuelve nuestro problema. Lo que necesita es una tercera clase (llámese Cuenta, Sólo para las muecas) que encarna las cosas que son comunes entre las Comprobación y Ahorros, como se muestra aquí.

Basando & lt; i & gt; Comprobación de & lt; / i & gt; y & lt; i & gt; Savings & lt; / i & gt; en un común & lt; i & gt; cuenta & lt; / i & gt; clase “/ & gt;. & lt; / p & gt; & lt; div class =Fundamento Comprobación y Ahorros en un común Cuenta clase.

¿De qué manera la construcción de una nueva cuenta de resolver los problemas? En primer lugar, la creación de una nueva Cuenta clase es una descripción más precisa del mundo real (sea lo que sea). Por supuesto, en realidad es algo conocido como una cuenta. Las cuentas de ahorro y cuentas corrientes son casos especiales de este concepto más fundamental.

Además, la clase Ahorros está aislado de los cambios en la clase Comprobación (y viceversa). Si los institutos bancarios un cambio fundamental en todas las cuentas, puede modificar Cuenta, y todas las subclases heredarán automáticamente el cambio. Pero si el banco cambia su política sólo para las cuentas de cheques, puede modificar sólo la Comprobación clase cuenta sin afectar Ahorros.

Este proceso de sacrificio de las propiedades comunes de las clases similares es la esencia de la factorización de clase.

Video: curso clase derivadas herencia y polimorfismo en c++ estructura de datos

Factoring es legítima sólo si la relación de herencia corresponde a la realidad. Factoring juntos una clase Ratón y Palanca de mando porque son tanto de hardware como dispositivos de señalización es legítimo. Factoring juntos una clase Ratón y Monitor porque ambos hacen llamadas de bajo nivel del sistema operativo no lo es.

">
Artículos Relacionados