Explorando la generalización, especialización y dependencia en POO

OOP (programación orientada a objetos) es un paradigma que se centra en objetos y datos en lugar de acciones y lógica. Al trabajar con OOP, es imperativo que identifique los objetos y sus relaciones.

En OOP, un problema se descompone en varios objetos y cómo se relacionan entre sí, un proceso conocido como modelado de datos. Las relaciones esenciales entre objetos incluyen: asociación, generalización, especialización, agregación, dependencia y composición. En este artículo discutiremos las relaciones de dependencia y herencia en OOP con ejemplos de código en C # para ilustrar los conceptos.

Dependencia

Una dependencia es una relación entre dos o más objetos en la que un objeto depende del otro objeto u objetos para su implementación. Si uno de estos objetos cambia, los otros objetos pueden verse afectados. La relación de dependencia entre dos o más objetos se representa en UML mediante flechas discontinuas. En otras palabras, cuando existe una relación de dependencia entre dos o más objetos, el objeto necesita conocer los otros objetos de los que depende.

Considere las clases BlogEntry y View. Mientras que el primero contiene toda la información relacionada con las entradas del blog, el segundo se ocupa de mostrar los datos recibidos de la clase BlogEntry en la interfaz de usuario. Entonces, la clase View depende de la clase BlogEntry para mostrar contenidos (entradas de blog) en la interfaz de usuario. Por tanto, existe una relación de dependencia entre las clases View y BlogEntry. Una relación de dependencia se representa en UML mediante una flecha discontinua.

public class BlogEntry

    {

        //Members of the BlogEntry class

    }

public class View

    {

        //Members of the View class

    }

Generalización y especialización

La generalización puede definirse como la técnica de extraer las características esenciales (que incluyen atributos, propiedades y métodos) de dos o más subclases y luego combinarlas dentro de una clase base generalizada (también llamada superclase). Por el contrario, la especialización es lo opuesto a la generalización: se usa para representar la relación "tipo de" creando subclases a partir de clases base existentes.

La herencia se define como la capacidad de una clase para extender una o más clases (también conocidas como clases base). Tenga en cuenta que la generalización es la forma más fuerte de relaciones de clase, ya que las clases que participan en una relación de generalización están estrechamente unidas entre sí; la mayoría de las complejidades internas de la clase principal son visibles para la clase secundaria.

La clase que extiende la clase base o principal también se conoce como clase secundaria o clase derivada. La clase heredada o generalizada extiende o hereda su clase base o padre. En herencia, una clase secundaria hereda los métodos y atributos de la clase base o principal, excepto aquellos que son privados. En esencia, los miembros privados de la clase base no se heredan ya que pertenecen "únicamente" a la clase de la que forman parte. Por lo tanto, debe aprovechar la generalización solo cuando necesite representar una clase que en realidad es una forma más especializada de otra clase.

La herencia es de los siguientes tipos:

  • Soltero
  • Múltiple
  • Multi nivel
  • Jerárquico
  • Híbrido

La herencia única es la forma más simple de herencia en la que una clase extiende a otra clase. El siguiente fragmento de código ilustra esta forma de herencia: observe cómo la clase BlogAuthor extiende la clase Author.

public class Author

    {

        //Members of the Author class

    }

public class BlogAuthor : Author

    {

        //Members of the BlogAuthor class

    }

En la herencia múltiple, tiene varias clases base de las que se deriva una clase. Tenga en cuenta que la herencia múltiple no es compatible con lenguajes de programación OOP como Java o C #.

El siguiente tipo de herencia en nuestra lista es la herencia de varios niveles. En esta forma de herencia tienes clases heredadas unas de otras para formar una cadena. El siguiente fragmento de código ilustra esto.

public class Person

    {

        //Members of the Person class

    }

public class Author : Person

    {

        //Members of the Author class

    }

public class BlogAuthor : Author

    {

        //Members of the BlogAuthor class

    }

En herencia jerárquica tienes clases que representan una estructura jerárquica a través de la herencia, similar a un árbol genealógico. En este tipo de herencia, tiene más de una clase secundaria que tiene la misma clase base o principal. En otras palabras, este es un tipo de herencia en la que una o más clases derivadas tienen una base común o una clase principal.

La herencia híbrida es un tipo de herencia en la que dos o más formas de herencia se combinan en una. Esencialmente, este tipo de herencia es una combinación de dos o más formas de herencia para formar una estructura cerrada. Tenga en cuenta que la herencia híbrida tampoco se admite en lenguajes de programación OO como C # o Java.