Está en la página 1de 18

CLASE 3

Introducción a la programación
Herencia
3.1 HERENCIA

Dos clases pueden estar relacionadas por la colaboración. Ahora veremos otro tipo de relaciones
entre clases que es la Herencia.

La herencia significa que se pueden crear nuevas clases partiendo de clases existentes, que tendrá
todas los atributos, propiedades y los métodos de su 'superclase' o 'clase padre' y además se le
podrán añadir otros atributos, propiedades y métodos propios.

clase padre

Clase de la que desciende o deriva una clase. Las clases hijas (descendientes) heredan (incorporan)
automáticamente los atributos, propiedades y métodos de la la clase padre.

Subclase

Clase desciendiente de otra. Hereda automáticamente los atributos, propiedades y métodos de su


superclase. Es una especialización de otra clase. Admiten la definición de nuevos atributos y
métodos para aumentar la especialización de la clase.

Introducción a la programación
Lorem ipsum O1
Veamos algunos ejemplos teóricos de herencia:

El primer tipo de relación que habíamos visto entre dos clases, es la de colaboración.

Recordemos que es cuando una clase contiene un objeto de otra clase como atributo. Cuando la
relación entre dos clases es del tipo "...tiene un..." o "...es parte de...", no debemos implementar
herencia. Estamos frente a una relación de colaboración de clases no de herencia.

Si tenemos una ClaseA y otra ClaseB y notamos que entre ellas existe una relación de tipo "... tiene
un...", no debe implementarse herencia sino declarar en la clase ClaseA un atributo de la clase
ClaseB.

O2 Introducción a la programación
Por ejemplo: tenemos una clase Auto, una clase Rueda y una clase Volante. Vemos que la relación
entre ellas es: Auto "...tiene 4..." Rueda, Volante "...es parte de..." Auto; pero la clase Auto no debe
derivar de Rueda ni Volante de Auto porque la relación no es de tipo-subtipo sino de colaboración.
Debemos declarar en la clase Auto 4 atributos de tipo Rueda y 1 de tipo Volante.

Luego si vemos que dos clase responden a la pregunta ClaseA "..es un.." ClaseB es posible que haya una
relación de herencia.
Por ejemplo:
Auto "es un" Vehiculo
Circulo "es una" Figura
Mouse "es un" DispositivoEntrada
Suma "es una" Operacion

Problema 1:

Ahora plantearemos el primer problema utilizando herencia. Supongamos que necesitamos


implementar dos clases que llamaremos Suma y Resta. Cada clase tiene como atributo valor1, valor2
y resultado. Las propiedades a definir son Valor1, Valor2 y Resultado, el método Operar (que en el caso
de la clase "Suma" suma los dos Valores y en el caso de la clase "Resta" hace la diferencia entre Valor1
y Valor2.
Si analizamos ambas clases encontramos que muchas propiedades son idénticos. En estos casos es
bueno definir una clase padre que agrupe dichas propiedades, atributos y responsabilidades
comunes.
La relación de herencia que podemos disponer para este problema es:

Introducción a la programación O3
Solamente el método operar es distinto para las clases Suma y Resta (esto hace que no lo
podamos disponer en la clase Operacion), luego las propiedades Valor1, Valor2 son idénticos a
las dos clases, esto hace que podamos disponerlos en la clase Operacion. Lo mismo las
propiedades Valor1, Valor2 y Resultado se definirán en la clase padre Operacion.

Crear un proyecto y luego crear cuatro clases llamadas: Operacion, Suma, Resta y Prueba

Programa:

O4 Introducción a la programación
Introducción a la programación O5
O6 Introducción a la programación
La clase Operación define tres atributos y sus tres propiedades que las acceden:
protected int valor1;
protected int valor2;
protected int resultado;
public int Valor1
{
set
{
valor1=value;
}
get
{
return valor1;
}
}
public int Valor2
{
set
{
valor2=value;
}
get
{
return valor2;

Introducción a la programación O7
}
}
public int Resultado
{
protected set
{
resultado=value;
}
get
{
return resultado;
}
}

Ya veremos que definimos los atributos con este nuevo modificador de acceso (protected) para que
la subclase tenga acceso a dichos atributos. Si los definimos private las subclases no pueden
acceder a dichos atributos.

Ahora veamos como es la sintaxis para indicar que una clase hereda de otra:

public class Suma: Operacion


Disponemos dos puntos y seguidamente el nombre de la clase padre (con esto estamos indicando
que todas las propiedades de la clase Operación son también propiedades de la clase Suma.

O8 Introducción a la programación
Luego la característica que añade la clase Suma es el siguiente método:

public void Operar()


{
Resultado=Valor1+Valor2;
}

El método Operar puede acceder a las propiedades heredadas (siempre y cuando los mismos se
declaren protected, en caso que sean private si bien lo hereda de la clase padre solo los pueden
modificar métodos de dicha clase padre)
Ahora podemos decir que la clase Suma tiene tres propiedades y un método.

Luego en otra clase creamos un objeto de la clase Suma:


class Prueba
{
static void Main(string[] args)
{
Suma suma1 = new Suma();
suma1.Valor1 = 10;
suma1.Valor2 = 7;
suma1.Operar();
Console.WriteLine("La suma de " + suma1.Valor1 + " y " +
suma1.Valor2 + " es " + suma1.Resultado);

Resta resta1 = new Resta();


resta1.Valor1 = 8;
resta1.Valor2 = 4;

Programar en JAVA O9
resta1.Operar();
Console.WriteLine("La diferencia de " + resta1.Valor1 +
" y " + resta1.Valor2 + " es " + resta1.Resultado);
Console.ReadKey();
}
}

Podemos llamar tanto al método propio de la clase Suma "Operar()" como acceder a las propiedades
heredadas de la clase Operacion. Quien utilice la clase Suma solo debe conocer que métodos y
propiedades públicas tiene (independientemente que pertenezcan a la clase Suma o a una clase
superior)
La lógica es similar para declarar la clase Resta.
La clase Operación agrupa en este caso un conjunto de atributos y propiedades comunes a un
conjunto de subclases (Suma, Resta). No tiene sentido definir objetos de la clase Operacion.
El planteo de jerarquías de clases es una tarea compleja que requiere un perfecto entendimiento de
todas las clases que intervienen en un problema, cuales son sus atributos, propiedades y
responsabilidades.
1.6 POLIMORFISMO
Polimorfismo es uno de los pilares de la programación orientada a objetos que mas se utiliza, lo
único que es dejado de lado por los programadores en cuanto a su uso en las aplicaciones de
negocios.

En este post trataré de explicar su utilización en la programación. Primero tratemos de definir la


palabra polimorfismo según una búsqueda por internet seria, Poli = muchos y Morfo = formas; si lo
decimos literalmente seria “muchas formas”.

10 Introducción a la programación
En programación seria la capacidad que tiene una clase en convertirse en un nuevo objeto sin
cambiar su esencia y luego volver al objeto origina de donde salió.

Hay tres tipos de polimorfismo definamos cada uno:

1. polimorfismo por herencia: cuando se hereda de una clase normal y puedo convertirme en ella.

2. polimorfismos por abstracción: cuando puedo heredar de una clase abstracta y puedo
convertirme en ella.
1.7 INTERFAZ
3. polimorfismo por interface: es la posibilidad que tenemos de implementar una interface y puedo
convertirme en ella.
1.7 INTERFAZ
Interfaces: definición del comportamiento de varios tipos
Una interfaz contiene definiciones para un grupo de funcionalidades relacionadas que un elemento
no abstracto class o un struct debe implementar. Una interfaz puede definir métodos static, que
deben tener una implementación. A partir de C# 8.0, una interfaz puede definir una implementación
predeterminada de miembros. Una interfaz no puede declarar datos de instancia, como campos,
propiedades implementadas automáticamente o eventos similares a las propiedades.

Mediante las interfaces puede incluir, por ejemplo, un comportamiento de varios orígenes en una
clase. Esta capacidad es importante en C# porque el lenguaje no admite la herencia múltiple de
clases. Además, debe usar una interfaz si desea simular la herencia de estructuras, porque no
pueden heredar de otra estructura o clase. Para definir una interfaz, use la interface palabra clave
como se muestra en el ejemplo siguiente.

Programar en JAVA 11
interface IEquatable<T>
{
bool Equals(T obj);
}

El nombre de una interfaz debe ser un nombre de identificador de C# válido. Por convención, los
nombres de interfaz comienzan con una letra I mayúscula.

Cualquier clase o estructura que implementa la interfaz IEquatable<T> debe contener una
definición para un método Equals que coincida con la firma que la interfaz especifica. Como
resultado, puede contar con una clase que implementa IEquatable<T> para contener un método
Equals con el que una instancia de la clase puede determinar si es igual a otra instancia de la misma
clase.

La definición de IEquatable<T> no facilita ninguna implementación para Equals. Una clase o


estructura puede implementar varias interfaces, pero una clase solo puede heredar de una sola
clase.

Las interfaces pueden contener propiedades, eventos, indizadores o métodos de instancia, o bien
cualquier combinación de estos cuatro tipos de miembros. Las interfaces pueden contener
constructores estáticos, campos, constantes u operadores. A partir de C# 11, los miembros de
https://open-bootcamp.com/cursos/java/herencia
interfaz que no son campos pueden ser static abstract. Una interfaz no puede contener campos de
instancia, constructores de instancias ni finalizadores. Los miembros de interfaz son públicos de
forma predeterminada y se pueden especificar explícitamente modificadores de accesibilidad,
como public, protected, internal, private, protected internal o private protected. Un miembro
private debe tener una implementación predeterminada.

12 Introducción a la programación
Para implementar un miembro de interfaz, el miembro correspondiente de la clase de
implementación debe ser público, no estático y tener el mismo nombre y firma que el miembro de
interfaz.

Nota

Cuando una interfaz declara miembros estáticos, un tipo que implementa esa interfaz también puede
declarar miembros estáticos con la misma firma. Estos son distintos y identificados de forma única
por el tipo que declara el miembro. El miembro estático declarado en un tipo no invalida el miembro
estático declarado en la interfaz.

Una clase o estructura que implementa una interfaz debe proporcionar una implementación para
todos los miembros declarados sin una implementación predeterminada que proporcione la interfaz.
Sin embargo, si una clase base implementa una interfaz, cualquier clase que se derive de la clase base
hereda esta implementación.

En el siguiente ejemplo se muestra una implementación de la interfaz IEquatable<T>. La clase de


implementación Car debe proporcionar una implementación del método Equals.

C#Copiar
public class Car : IEquatable<Car>
{
public string? Make { get; set; }
public string? Model { get; set; }
public string? Year { get; set; }
public bool Equals(Car? car)

Introducción a la programación 13
// Implementation of IEquatable<T> interface
public bool Equals(Car? car)
{
return (this.Make, this.Model, this.Year) ==
(car?.Make, car?.Model, car?.Year);
}
}

Las propiedades y los indizadores de una clase pueden definir descriptores de acceso adicionales para
una propiedad o indizador que estén definidos en una interfaz. Por ejemplo, una interfaz puede
declarar una propiedad que tenga un descriptor de acceso get. La clase que implementa la interfaz
puede declarar la misma propiedad con un descriptor de acceso get y set. Sin embargo, si la propiedad
o el indizador usan una implementación explícita, los descriptores de acceso deben coincidir. Para
obtener más información sobre la implementación explícita, vea Implementación de interfaz
explícita y Propiedades de interfaces.

Las interfaces pueden heredar de una o varias interfaces. La interfaz derivada hereda los miembros
de sus interfaces base. Una clase que implementa una interfaz derivada debe implementar todos los
miembros de esta, incluidos los de las interfaces base. Esa clase puede convertirse implícitamente en
la interfaz derivada o en cualquiera de sus interfaces base. Una clase puede incluir una interfaz varias
veces mediante las clases base que hereda o mediante las interfaces que otras interfaces heredan. Sin
embargo, la clase puede proporcionar una implementación de una interfaz solo una vez y solo si la
clase declara la interfaz como parte de la definición de la clase (class ClassName : InterfaceName). Si
la interfaz se hereda porque se heredó una clase base que implementa la interfaz, la clase base
proporciona la implementación de los miembros de la interfaz. Sin embargo, la clase derivada puede
volver a implementar cualquier miembro de la interfaz virtual, en lugar de usar la implementación
heredada.

14 Introducción a la programación
Cuando las interfaces declaran una implementación predeterminada de un método, cualquier
clase que implemente esa interfaz hereda esa implementación (debe convertir la instancia de clase
al tipo de interfaz para tener acceso a la implementación predeterminada en el miembro
Interface). Una clase base también puede implementar miembros de interfaz mediante el uso de los
miembros virtuales. En ese caso, una clase derivada puede cambiar el comportamiento de la
interfaz reemplazando los miembros virtuales. Para obtener más información sobre los miembros
virtuales, vea Polimorfismo.
https://learn.microsoft.com/es-es/dotnet/csharp/fundamentals/object-oriented/polymorphis

Resumen de interfaces

Una interfaz tiene las propiedades siguientes:

• En las versiones de C# anteriores a la 8.0, una interfaz es como una clase base abstracta con solo
miembros abstractos. Cualquier clase o estructura que implemente la interfaz debe implementar
todos sus miembros.

• A partir de la versión 8.0 de C#, una interfaz puede definir implementaciones predeterminadas
para algunos o todos sus miembros. Una clase o estructura que implemente la interfaz no tiene que
implementar los miembros que tengan implementaciones predeterminadas. Para obtener más
información, vea Métodos de interfaz predeterminados.

• No se puede crear una instancia de una interfaz directamente. Sus miembros se implementan por
medio de cualquier clase o estructura que implementa la interfaz.

• Una clase o estructura puede implementar varias interfaces. Una clase puede heredar una clase
base y también implementar una o varias interfaces.

Introducción a la programación 15

También podría gustarte