Inheritance


Inheritance

It is possible to create a new class using another class as basis. For instance, suppose you have a class that represents an object in the physical world of humans. Each of these objects will have a position (x, y, z), size (width, height and depth), and a color. Suppose now that you are writing a program for a point of sale, and require an Item class. Even though, it is possible to create the Item class from scratch, it is better to derive the Item class from MyObject class. Specifically, the Item will have a name, a price and can be bought or sold. Inheritance can reduce your code significantly, as it is possible to reuse the implementation of one class in another class. When designing classes please check if the classes have properties or methods in common, if they do, you should try to use inheritance.
Es posible crear una clase usando otra clase como base. Por ejemplo, suponga que usted tiene una clase que representa un objeto en el mundo físico de los humanos. Cada uno de estos objetos tendrá una posición (x, y, z), tamaño (ancho, alto y profundidad), y un color. Suponga ahora que usted quiere escribir un programa de un punto de venta, y requiere una clase Item. Aún cuando es posible crear la clase Item desde cero, es mucho mejor derivar la clase Item usando la clase MyObject. Específicamente, el producto tendrá un nombre, un precio y puede ser comprado o vendido. La herencia puede reducir su código en forma significativa, ya que es posible reusar la implementación de una clase en otra clase. Siempre que se diseñen las clases usted debe verificar si las clases no tienen propiedades o métodos en común, si es así, usted debe intentar usar la herencia.

Problem 1
Discuss the differences between an object in the physical world and an object in a store. Observe that an object in a store is more specific than an object in the physical world.
Discuta las diferencias en un objeto en el mundo físico de los humanos y un objeto en una tienda. Observe que un objeto en una tienda es más específico, de la misma forma un objeto en el mundo físico de los humanos es más general.

Problem 2
Compute the output of the shown program. The MyObject class respresents a generic object with a position and a size. The Item class represent an object that has (besides its position and size) a price and a name. Additionally, the item can be sold or bought.
Calcule la salida del programa mostrado. La clase MyObject representa un objeto genérico con posición y tamaño. La clase Item representa un objeto que tiene (aparte de su posición y tamaño) un precio y un nombre. Adicionalmente, el item se puede comprar o vender.

Inheritance

MyObjectItemUML

MyObject.h
#pragma once
struct Position
{
     double x;
     double y;
     double z;
};

class MyObject
{
public:
     MyObject(void);
     MyObject(const wchar_t* debugName);
     ~MyObject(void);
     Position position;
     double width;
     double height;
     double depth;
     wstring debugName;
};

MyObject.cpp
#include "StdAfx.h"
#include "MyObject.h"

MyObject::MyObject()
{
     this->debugName = L"No name";
     ::MessageBox(NULL, debugName.c_str(), L"MyObject::Create", MB_OK);
     //
     position.x = 0.0;
     position.y = 0.0;
     position.z = 0.0;
     //
     width = 0.0;
     height = 0.0;
     depth = 0.0;     
}

MyObject::MyObject(const wchar_t* debugName)
{
     this->debugName = debugName;
     ::MessageBox(NULL,debugName,L"MyObject::Create",MB_OK);
     //
     position.x = 0.0;
     position.y = 0.0;
     position.z = 0.0;
     //
     width = 0.0;
     height = 0.0;
     depth = 0.0;
}

MyObject::~MyObject(void)
{
     ::MessageBox(NULL, debugName.c_str(), L"MyObject::Destroy", MB_OK);
}

Item.h
#pragma once
#include "MyObject.h"
class Item : public MyObject
{
public:
     Item(void);
     ~Item(void);
     wstring name;
     double price;
     void Buy();
     void Sell();
};


item.cpp
#include "StdAfx.h"
#include "Item.h"

Item::Item(void)
{
     ::MessageBox(NULL, debugName.c_str(), L"Item::Create", MB_OK);
     //
     price = 0.0;     
}

Item::~Item(void)
{
     ::MessageBox(NULL, debugName.c_str(), L"Item::Destroy", MB_OK);
}

void Item::Buy()
{
     wstring text;
     Sys::Format(text,
          L"%s\r\nPosition: %f, %f, %f\r\nSize: %fx%fx%f\r\nCost: $%.2f",
          name.c_str(),
          position.x, position.y, position.z,
          width, height, depth, price);
     ::MessageBox(NULL, text.c_str(), L"BUY", MB_OK);
}

void Item::Sell()
{
     wstring text;
     Sys::Format(text,
          L"%s\r\nPosition: %f, %f, %f\r\nSize: %fx%fx%f\r\nCost: $%.2f",
          name.c_str(),
          position.x,position.y,position.z,
          width,height,depth,price);
     ::MessageBox(NULL, text.c_str(), L"SELL", MB_OK);
}


ItemClass

Space.cpp
...
void Space::Window_Open(Win::Event& e)
{
     Item a;
     a.debugName = L"a";
     a.position.x = 10;
     a.position.y = 50;
     a.width = 20;
     a.price = 49.99;
     a.Sell();

     MyObject b(L"b");
     b.position.x = 11.1;
     a.depth = 8.5;
     a.Buy();
}


Tip
You should try to write as much as possible code that is easy to read and understand. If using inheritance makes your code much more difficult to read and understand, you probably should not use inheritance. In fact, Object-Oriented Programming must be used to make the code ease to read and understand.
Usted debe tratar de escribir tanto como pueda código que es fácil de leer y entender. Si usar la herencia hace que su código sea mucho más difícil de leer y entender, usted probablemente no debería usar herencia. De hecho, la Programación Orientada a Objetos debe ser usar para hacer el código fácil de leer y entender.

Tip
Observe the structured programming promotes the creation of long files, while OOP promotes the creation of several short files.
Observe que la programación estructurada promueve la creación de archivos largos, mientras que la POO promueve la creación de varios archivos cortos.

Protected Members of a Class

As you must remember a member function or member variable can be public or private. Inheritance provides a the keyword protected. Any member variable or function that is declared as protected can be used by the derived class.
Usted debe recordar que una función miembro o una variable miembro pueden ser públicas o privadas. La herencia introduce la palabra clave protected. Cualquier variable o función miembro que es declarada como protected puede ser usada por la clase derivada.

AccessTable

Problem 3
Add the My3DPoint class to your Space project. You must derive this class from the MyPoint class. Modify your code so that the program can compile and run. Hint: use protected.
Agregue la clase My3DPoint al proyecto Space. Usted debe derivar la clase desde la clase MyPoint. Modifique el código de tal forma su programa puede compilar y ejecutarse. Sugerencia: use protected.

My3DPointWizard

Space.cpp
...

void Space::Window_Open(Win::Event& e)
{
     My3DPoint a, b;
     a.x = 10.0;
     a.y = 12.0;
     a.z = 25.5;
     b.x = 4.4;
     Display(a);
     Display(b);
     MyPoint c;
     c.x = 18.8;
     Display(c);
}
...

My3DPoint

Problem 4
Indicate whether the following statement is true or false: The Human class describes human which have arms, legs, eyes, eye color, etc., and their functions are: run, sleep, eat, etc . The Employee class is derived from the Human class because an employee is a human with a job, salary, working hours, etc.
Diga si lo siguiente es verdadero o falso: La clase Humano describe los humanos que tienes brazos, piernas, ojos, color de ojos, etc., y sus funciones: correr, dormir, comer, etc. La clase Empleado se deriva de la clase Humano ya que un empleado es un humano con un trabajo, sueldo, horario, etc.

Problem 5
Indicate whether the following statement is true or false: The base class is Human, and it is possible to derive to create the classes: Patient and Doctor. This way a patient and a doctor have all properties and functions of Humans. Additionally, a Doctor can be a Patient, that is, it is possible to derive Doctor from the Patient class.
Diga si lo siguiente es verdadero o falso: La clase base es Humano y se pueden derivar las clases: Paciente y Médico. De esta forma el paciente y el médico tienen todas las propiedades y funciones de Humano. Adicionalmente, un médico puede ser paciente, o sea que se puede derivar el médico de paciente.

Problem 6
Indicate whether the following statement is true or false: if in an object of a given class one of its properties is changed, the object is converted to an object of a different class.
Diga si lo siguiente es verdadero o falso: si a un objeto de una clase se la cambia el valor de una de sus propiedades, este se convierte en un objeto de otra clase.

Problem 7
Indicate whether the following statement is true or false: There is a class with properties and functions, however, it is better to leave the properties in a base class and move the functions to a new class (derived from the first one.)
Diga si lo siguiente es verdadero o falso: Se tiene una clase con propiedades y funciones, sin embargo, es mejor dejar las propiedades en una clase base y mover las funciones a una clase nueva (derivada de la primera).

Problem 8
Indicate whether the following statement is true or false: The base class is GeometricObject, from this class, it is recommended to create the derived classes: Prism, Pyramid, Sphere. From the Prism class, we can derived: CircularPrism and RectangularPrism.
Diga si lo siguiente es verdadero o falso: La clase base es CuerpoGeometrico, de esta clase se recomienda derivar las clases: Prisma, Pirámide, Esfera. De la clase Prisma se pueden derivar las clases: PrismaCircular y PrismaRectagular.

Problem 9
Create a class diagram with properties to organize the following classes: Forest, Character, Scenery, Mission, Treasure, Reward, sword, find key, Ogre, Fairy, Wizard, Witch, Castle, Road, Hill, kill witch.
Cree un diagrama de clases con sus propiedades para organizar las siguientes clases: Bosque, Personaje, Escenario, Misión, Tesoro, Recompensa, espada, encontrar llave, Ogro, Hada, Mago, Bruja, Castillo, Camino, Colina, matar bruja.

Problem 10
Create a class diagram with properties to organize the following classes: Room, Bathroom, Kitchen, Garage, LivingRoom, Laundry.
Cree un diagrama de clases con sus propiedades para organizar las siguientes clases: Cuarto, Baño, Cocina, Cochera, Sala, Cuarto de Lavado.

Tip
When creating a base class:
  • The base class must be generic so that a derived class can exist.
  • Think of several object of different class that have something in common, and create a class with the common properties and functions

Cuando cree una clase base:
  • La clase base debe ser genérica de tal forma que la clase derivada pueda existir
  • Piense en varios objetos de clases diferentes que tenga algo en común, y cree una clase con estas propiedades y funciones en común

Problem 11
Indicate whether the class can be used as a base class: (a) Car, (b) Cinema, (c) Nurse, (d) Entertainment, (e) Mammals, (f) Toy, (g) Human, (h) Transportation, (i) ElectronicDevice, (j) Bicycle, (k) Item, (l) Occupation, (m) Pet, (n) Cloth, (o) Skirt.
Diga si la clase se puede usar como base: (a) Carro, (b) Cine, (c) Enfermera, (d) Entretenimiento, (e) Mamífero, (f) Juguete, (g) Humano, (h) Transporte, (i) DispositivoElectronico, (j) Bicicleta, (k) Producto, (l) Ocupacion, (m) Mascota, (n) Ropa, (o) Falda.

Tip
JavaThe following example illustrates how to use inheritance in Java. The main difference between C++ and Java to use inheritance is that Java uses the extends keyword.
El siguiente ejemplo ilustra cómo usar la herencia en Java. La principal diferencia entre C++ y Java para usar la herencia es que Java usa la palabra clave extends.

MyObject.java
public class MyObject
{
     struct Position
     {
          double x;
          double y;
          double z;
     };
     double width;
     double height;
     double depth;
     Position position;
     public MyObject()
     {
          position.x = 0.0;
          position.y = 0.0;
          position.z = 0.0;
          width = 0.0;
          height = 0.0;
          depth = 0.0;          
     }
};


Item.java
public class Item extends MyObject
{
     String name;
     double price;
     public Item()
     {
          name = "";
          price = 0.0;          
     }
     public void Buy()
     {
     }
     public void Sell()
     {
     }
};

© Copyright 2000-2021 Wintempla selo. All Rights Reserved. Jul 22 2021. Home