La palabra clave 'base'
Parte de la sección Programación Orientada a Objetos del Journey de C# de Coddy — lección 20 de 70.
Cuando una clase derivada hereda de una clase base, a menudo es necesario acceder directamente a los miembros del padre. La palabra clave base proporciona esta conexión, permitiéndote llamar al constructor de la clase base o acceder a sus métodos y propiedades.
El uso más común de base es llamar al constructor de la clase padre. Al crear un objeto derivado, puedes pasar valores a la clase base:
public class Animal
{
public string Name { get; set; }
public Animal(string name)
{
Name = name;
}
}
public class Dog : Animal
{
public string Breed { get; set; }
public Dog(string name, string breed) : base(name)
{
Breed = breed;
}
}La sintaxis : base(name) llama al constructor Animal antes de que se ejecute el cuerpo del constructor Dog. Esto asegura que la clase base se inicialice correctamente primero.
También puedes usar base para llamar a métodos del padre desde dentro de la clase derivada:
public class Animal
{
public void Speak()
{
Console.WriteLine("Animal sound");
}
}
public class Dog : Animal
{
public void Speak()
{
base.Speak(); // Llama al método Speak de Animal
Console.WriteLine("Woof!");
}
}Aquí, base.Speak() llama explícitamente a la versión del método de la clase base. Esto es útil cuando quieres extender el comportamiento del padre en lugar de reemplazarlo por completo.
Desafío
FácilVamos a construir un sistema de inventario de productos que demuestre cómo las clases derivadas utilizan la palabra clave base para inicializar correctamente su clase base y extender el comportamiento heredado.
Crearás tres archivos para organizar tu código:
Product.cs: Define una claseProducten el espacio de nombresInventory. Esta clase base representa cualquier producto con una propiedadName(string) y una propiedadPrice(decimal). Incluye un constructor que acepte ambos valores y un métodoGetInfo()que devuelva"{Name}: ${Price}".ElectronicProduct.cs: Define una claseElectronicProducten el espacio de nombresInventoryque herede deProduct. Esta clase añade una propiedadWarrantyMonths(int). El constructor debe aceptar el nombre, el precio y los meses de garantía; utilizabasepara pasar el nombre y el precio al constructor de la clase base. Crea un métodoGetInfo()que primero llame alGetInfo()del padre usandobase, y luego añada" (Warranty: {WarrantyMonths} months)"para extender la salida.Program.cs: En tu archivo principal, crea unElectronicProductutilizando los valores de entrada y muestra su información completa llamando aGetInfo().
Recibirás tres entradas:
- Nombre del producto
- Precio
- Meses de garantía
Imprime el resultado de llamar a GetInfo() en tu producto electrónico.
Por ejemplo, si las entradas son Laptop, 999.99, y 24, la salida debería ser:
Laptop: $999.99 (Warranty: 24 months)Observa cómo la clase derivada construye sobre la salida de la clase base en lugar de duplicar la lógica. ¡La palabra clave base te permite reutilizar y extender el comportamiento del padre sin problemas!
Hoja de referencia
La palabra clave base permite que una clase derivada acceda a los miembros de su clase base.
Use base para llamar al constructor de la clase base:
public class Animal
{
public string Name { get; set; }
public Animal(string name)
{
Name = name;
}
}
public class Dog : Animal
{
public string Breed { get; set; }
public Dog(string name, string breed) : base(name)
{
Breed = breed;
}
}La sintaxis : base(name) llama al constructor base antes de que se ejecute el cuerpo del constructor de la clase derivada, asegurando una inicialización adecuada.
Use base para llamar a métodos base desde la clase derivada:
public class Animal
{
public void Speak()
{
Console.WriteLine("Animal sound");
}
}
public class Dog : Animal
{
public void Speak()
{
base.Speak(); // Llama al Speak de Animal
Console.WriteLine("Woof!");
}
}Esto le permite extender el comportamiento base en lugar de reemplazarlo por completo.
Pruébalo tú mismo
using System;
using Inventory;
class Program
{
public static void Main(string[] args)
{
// Leer las entradas
string name = Console.ReadLine();
decimal price = Convert.ToDecimal(Console.ReadLine());
int warrantyMonths = Convert.ToInt32(Console.ReadLine());
// TODO: Crear un ElectronicProduct con los valores de entrada
// TODO: Imprimir el resultado de llamar a GetInfo() en tu producto electrónico
}
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación Orientada a Objetos
1Fundamentos de OOP
Archivos externosNamespaces y directivasIntro a clases y objetosLa palabra clave 'this'Métodos y parámetrosCampos vs PropiedadesConstructoresInicializadores de objetosResumen - Calculadora simple4Herencia
Sintaxis básica de herencia (:)La palabra clave 'base'Palabras clave Virtual y OverrideClases selladas (Sealed)La clase base 'object'Resumen: Jerarquía de empleados7Características avanzadas
Sobrecarga de operadoresIndexadores (this[])Sobrescritura de ToString()Métodos de extensiónResumen - Lista personalizada10Patrones de diseño - Parte 1
Introducción a los patrones de diseñoSingleton Thread-SafePatrón FactoryPatrón Observer (Eventos)Patrón Strategy2Propiedades y miembros estáticos
Propiedades autoimplementadasPropiedades de solo lectura y escrituraCampos y métodos estáticosClases estáticasMiembros con cuerpo de expresión5Polimorfismo e Interfaces
Polimorfismo: Compilación vs. EjecuciónInterfaz vs. Clase AbstractaInterfaces MúltiplesInterfaces ExplícitasUpcasting y DowncastingRepaso: Calculadora de Figuras8Conceptos avanzados de POO
Composición sobre herenciaGenéricos (clases y métodos)Delegados y eventosAtributos y ReflexiónIDisposable y la sentencia usingFundamentos de Inyección de dependencias11Patrones de diseño, parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón Composite3Arquitectura de clases
Datos de instancia vs. estáticosPalabras clave 'readonly' y 'const'Campos de respaldoResumen - Gestor de cuentas bancarias6Encapsulamiento
Modificadores de accesoPropiedades para el encapsulamientoImplementación de ocultamiento de datosPatrones de inmutabilidadRepaso - Registros de estudiantes