Diseño y uso de clases

Completado

En la programación orientada a objetos (OOP), las clases son los bloques de creación de una aplicación. Comprender la relación entre clases y objetos es esencial.

  • Las clases son los planos que utilizan los desarrolladores para definir las propiedades (datos) y los métodos (comportamientos) de los objetos. Las clases permiten encapsular datos y comportamientos, lo que facilita la organización y gestión del código.
  • Los objetos son instancias de clases. Cuando se crea una instancia de una clase, se crea un objeto en memoria. Cada objeto tiene su propio conjunto de propiedades y métodos, pero comparte la misma estructura definida por la clase.

Examinar los objetos del mundo real que nos rodean puede ayudar a comprender cómo funcionan las clases y los objetos en la programación. Los objetos del mundo real tienen atributos (propiedades) y comportamientos (métodos) que definen su propósito y funcionalidad. Por ejemplo, un coche es un objeto con características como marca, modelo y color, y comportamientos como conducir y parar.

Objetos del mundo real

Las personas interactúan con objetos constantemente en sus vidas diarias. De hecho, casi todo lo que interactuamos se puede considerar como un objeto.

Los siguientes criterios pueden utilizarse para definir objetos en el mundo real:

  • Los objetos son las cosas que podemos ver y tocar.
  • Los objetos tienen un propósito.
  • Los objetos tienen partes que cumplen su función.

Un lápiz es un ejemplo de un objeto físico. El propósito de un lápiz es crear una nota o un dibujo. Las partes de un lápiz incluyen el cuerpo, la punta y tal vez una goma de borrar. Las piezas funcionan juntas para lograr el propósito previsto del lápiz.

También hay objetos físicos que existen como un ensamblado de otros objetos. En la lista siguiente se proporcionan ejemplos de objetos que se componen de otros objetos:

  • Un coche: su propósito es proporcionar transporte terrestre para personas y familias. Las partes de un coche incluyen el motor, las ruedas, el volante y muchas otras cosas. Las partes de un coche funcionan juntas para permitir el transporte terrestre.
  • Una casa: su propósito es proporcionar refugio. Las partes de una casa incluyen una base, paredes exteriores, un techo y habitaciones. Estas partes se combinan para crear un espacio habitable.
  • Un teléfono inteligente: su propósito es ayudar al usuario con tareas y actividades diarias. Las partes de un teléfono inteligente incluyen una pantalla, un microprocesador, memoria, almacenamiento, una batería, cámaras y botones. Estas partes funcionan conjuntamente para habilitar las características de comunicación, entretenimiento y productividad.

Cada parte de un coche, una casa o un teléfono inteligente es un objeto con su propio propósito y también puede ser un ensamblado de objetos.

Atributos y características de un objeto físico

Dedique un minuto a considerar el ejemplo de un lápiz. Un lápiz tiene partes (cuerpo, punta, goma de borrar) y un propósito (crear una nota o dibujo). Los lápices comparten estas características básicas. Sin embargo, no todos los lápices son los mismos.

Algunos lápices son cortos, algunos son largos. Algunos lápices son amarillos, algunos son negros. Algunos lápices tienen la punta roma, otros tienen la punta afilada. Algunos lápices tienen una goma de borrar, otros no.

Los atributos de un objeto suelen dividirse en las siguientes categorías físicas y de comportamiento:

  • Físicos: los atributos físicos son los aspectos de un objeto que se puede ver o medir.
  • Comportamiento: los atributos de comportamiento son los aspectos de un objeto que describen sus capacidades o interacciones con otros objetos.

En el ejemplo del lápiz, los atributos físicos incluyen la longitud del cuerpo, el color del cuerpo, la nitidez de la punta y si el lápiz tiene o no goma de borrar. Los atributos de comportamiento incluyen la capacidad de escribir, la capacidad de borrar y la capacidad de ser afilados. Un lápiz interactúa con un papel u otros objetos sólidos que se pueden escribir o dibujar.

Los atributos físicos a menudo se conocen como propiedades, mientras que los atributos de comportamiento se suelen conocer como funciones (métodos en programación de C#).

Clases de código y objetos en programación de C#

En el mundo de la programación en C#, las propiedades y métodos de los objetos se definen mediante una clase. Las clases proporcionan el modelo de lo que un objeto (una instancia de la clase) es capaz de hacer. El plano técnico de una clase se denomina definición de clase.

Cuando se ejecuta una aplicación, el equipo utiliza una definición de clase para asignar memoria a un objeto (una instancia de la clase). El equipo usa el plano técnico para configurar un bloque de memoria que sea el tamaño adecuado para el objeto. Un objeto es básicamente un bloque de memoria.

Los objetos de código, al igual que los objetos físicos, pueden tener valores diferentes asignados a sus propiedades.

Las clases encapsulan datos y comportamiento

Las clases proporcionan una manera de encapsular los datos y el comportamiento. La encapsulación es el proceso de combinar datos y comportamientos en una sola unidad. Las clases usan propiedades para habilitar el acceso a datos y métodos para habilitar comportamientos.

Propiedades de clase

Las propiedades de clase se usan para administrar los datos que diferencian un objeto (instancia de clase) de otro objeto del mismo tipo.

Las propiedades de clase permiten a los objetos leer, escribir o calcular el valor de las variables (campos de datos) definidas dentro de la clase. Las propiedades aparecen como miembros de datos públicos, pero se implementan como métodos especiales denominados accesos. Esta función facilita a los usuarios el acceso a los datos y, al mismo tiempo, contribuye a promover la seguridad y la flexibilidad de los datos.

Los valores de propiedad se pueden leer mediante un descriptor de acceso get y asignarlos mediante un descriptor de acceso set.

Métodos de clase

Los métodos de clase definen las acciones (comportamientos) que una clase puede realizar.

Los métodos pueden tomar parámetros que proporcionan datos de entrada y pueden devolver datos de salida a través de parámetros. Los métodos también pueden devolver un valor directamente, sin usar un parámetro.

Por ejemplo, la clase Console incluye los métodos WriteLine, ReadLine y Clear (entre otros). Estos métodos ayudan a habilitar los comportamientos previstos de la clase Console. Los métodos se pueden usar para realizar acciones, como cálculos, manipulación de datos o interacción con otros objetos.

Los métodos suelen estar diseñados para aceptar uno o más argumentos de método. Los argumentos del método se pasan al método como parámetros de la instrucción de llamada utilizada para invocar el método. Por ejemplo, el método WriteLine de la clase Console puede aceptar un argumento de cadena proporcionado por la instrucción de llamada.

Definiciones de clase en código de C#

En el ejemplo siguiente se muestra una clase simple en C#. La clase Phone tiene propiedades para Brand, Model y Year. La clase también incluye métodos para Call y Text.


public class Phone
{
    public string? Brand { get; set; }
    public string? Model { get; set; }
    public int Year { get; set; }

    public void Call(string phoneNumber)
    {
        Console.WriteLine($"Calling {phoneNumber}...");
    }

    public void Text(string phoneNumber, string message)
    {
        Console.WriteLine($"Texting {phoneNumber}: {message}");
    }
}

Uso de espacios de nombres

En la programación de C#, los espacios de nombres se usan de dos maneras:

  • La biblioteca de clases de .NET usa espacios de nombres para organizar sus muchas clases.
  • Los desarrolladores declaran sus propios espacios de nombres para ayudar a controlar el ámbito de los nombres de clase y de método en proyectos de programación más grandes.

Espacios de nombres en la biblioteca de clases de .NET

La biblioteca de clases de .NET usa espacios de nombres para agrupar tipos relacionados, lo que facilita la búsqueda y el uso de ellos.

Tenga en cuenta el fragmento de código siguiente:


System.Console.WriteLine("Hello World!");

En este ejemplo, System es un espacio de nombres y Console es una clase de ese espacio de nombres.

Proporcionar el nombre completo de la clase (System.Console) garantiza que se use la clase correcta. Sin embargo, el uso de nombres completos puede resultar complicado al trabajar con muchas clases del mismo espacio de nombres. Para mejorar la legibilidad del código, puede usar la directiva using. La directiva using permite usar tipos definidos en un espacio de nombres sin especificar el espacio de nombres completo de ese tipo.

El siguiente fragmento de código implementa la directiva using para mejorar la legibilidad del código:


using System;

Console.WriteLine("Hello World!");

Nota:

A partir de .NET 6, las directivas implícitasglobal using se agregan a los nuevos proyectos de C#. Esto significa que puede usar tipos definidos en estos espacios de nombres sin tener que especificar su nombre completo ni agregar manualmente una directiva "using". El aspecto implícito se refiere al hecho de que las directivas globales using se agregan a un archivo generado en el directorio obj del proyecto. Esta característica le permite usar Console.WriteLine sin declarar using System explícitamente al desarrollar aplicaciones en las versiones 6.0 o posteriores de .NET.

Organización de clases con espacios de nombres

Declarar sus propios espacios de nombres puede ayudarle a controlar el ámbito de los nombres de clase y método en proyectos de programación más grandes. Use la palabra clave namespace para declarar un espacio de nombres.

Tenga en cuenta el fragmento de código siguiente:


namespace SampleNamespace
{
    class SampleClass
    {
        public void SampleMethod()
        {
            System.Console.WriteLine("SampleMethod inside SampleNamespace");
        }
    }
}

El nombre del espacio de nombres debe ser un nombre de identificador de C# válido.

Puede declarar un espacio de nombres para todos los tipos definidos en ese archivo, como se muestra en el siguiente fragmento de código:


namespace SampleNamespace;

class SampleClass
{
    public void SampleMethod()
    {
        System.Console.WriteLine("SampleMethod inside SampleNamespace");
    }
}

class AnotherSampleClass
{
    public void AnotherSampleMethod()
    {
        System.Console.WriteLine("AnotherSampleMethod inside SampleNamespace");
    }
}

La ventaja de esta nueva sintaxis es que es más sencilla, ahorrando espacio horizontal y llaves. Esto facilita la lectura del código.

Información general de los espacios de nombres

Los espacios de nombres tienen las siguientes propiedades:

  • Organizan proyectos de código grandes.
  • Se delimitan mediante el operador ..
  • La directiva using obvia el requisito de especificar el nombre del espacio de nombres para cada clase.
  • El espacio de nombres global es el espacio de nombres "raíz": global::System siempre hace referencia al espacio de nombres del sistema .NET.

El uso de espacios de nombres para agrupar tipos relacionados facilita la búsqueda y el uso de ellos.