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 necesitas acceder directamente a los miembros de la clase principal. La palabra clave base proporciona esta conexión, lo que te permite 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 principal. 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 de Animal antes de que se ejecute el cuerpo del constructor de Dog. Esto garantiza 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ácilConstruyamos un sistema de inventario de productos que demuestre cómo las clases derivadas usan la palabra clave base para inicializar correctamente su clase principal y ampliar 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; usabasepara pasar el nombre y el precio al constructor de la clase principal. Crea un métodoGetInfo()que primero llame alGetInfo()de la clase principal usandobasey después añada" (Warranty: {WarrantyMonths} months)"para ampliar la salida.Program.cs: En tu archivo principal, crea unElectronicProductusando 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 se basa en la salida de la clase base en lugar de duplicar la lógica. ¡La palabra clave base te permite reutilizar y ampliar el comportamiento de la clase principal sin problemas!
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 estudiantesPractica por tu cuenta: Compilador de C# online