Menu
Coddy logo textTech

Miembros de instancia vs. estáticos

Parte de la sección Programación Orientada a Objetos del Journey de Dart de Coddy. Lección 17 de 110.

En las clases de Dart, los miembros (variables y métodos) pueden pertenecer a objetos individuales o a la propia clase. Comprender esta distinción es fundamental para organizar tu código de manera eficaz.

Los miembros de instancia pertenecen a cada objeto que creas. Cada objeto obtiene su propia copia de las variables de instancia, y los métodos de instancia operan sobre los datos de ese objeto específico:

class Dog {
  String name;  // Variable de instancia
  
  Dog(this.name);
  
  void bark() {  // Método de instancia
    print('$name says woof!');
  }
}

Dog dog1 = Dog('Buddy');
Dog dog2 = Dog('Max');

dog1.bark();  // Buddy dice woof!
dog2.bark();  // Max dice woof!

Cada objeto Dog tiene su propio name. Cambiar el nombre de un perro no afecta al otro.

Los miembros estáticos pertenecen a la propia clase, no a ningún objeto en particular. Se comparten entre todas las instancias y se accede a ellos mediante el nombre de la clase:

class Dog {
  String name;
  static int totalDogs = 0;  // Variable estática
  
  Dog(this.name) {
    totalDogs++;
  }
}

Dog dog1 = Dog('Buddy');
Dog dog2 = Dog('Max');

print(Dog.totalDogs);  // 2

La variable totalDogs es compartida: solo hay una copia independientemente de cuántos objetos Dog existan. Accedes a ella mediante el nombre de la clase Dog.totalDogs, no mediante una instancia.

challenge icon

Desafío

Fácil

Construyamos un sistema de contador de visitantes para un museo que registre tanto las visitas a cada exposición como las estadísticas generales del museo.

Organizarás tu código en dos archivos:

  • exhibit.dart: Define una clase Exhibit que represente una exposición del museo. Cada exposición debe tener:
    • Una variable de instancia name (String) para el nombre de la exposición
    • Una variable de instancia visitorCount (int) que comience en 0 para registrar cuántas personas visitaron esta exposición específica
    • Una variable estática totalVisitors (int) que comience en 0 para registrar el total de visitas de todas las exposiciones
    • Un constructor que reciba el nombre de la exposición
    • Un método recordVisit() que incremente tanto visitorCount de la exposición como totalVisitors de la clase
    • Un método displayStats() que imprima la información de la exposición
  • main.dart: Importa tu clase de exposición y crea dos exposiciones:
    • Una exposición 'Dinosaur Bones'
    • Una exposición 'Ancient Egypt'
    Registra 3 visitas a la exposición Dinosaur Bones y después registra 2 visitas a la exposición Ancient Egypt. Después de todas las visitas, llama a displayStats() en cada exposición en el orden en que fueron creadas y después imprime el total de visitantes de todas las exposiciones.

El método displayStats() debe imprimir con este formato exacto:

[name]: [visitorCount] visitors

Para la línea del total de visitantes, imprime:

Total museum visitors: [totalVisitors]

Accede a la variable estática usando el nombre de la clase Exhibit.totalVisitors.

Salida esperada:

Dinosaur Bones: 3 visitors
Ancient Egypt: 2 visitors
Total museum visitors: 5

Pruébalo tú mismo

import 'exhibit.dart';

void main() {
  // TODO: Create a 'Dinosaur Bones' exhibit
  
  // TODO: Create an 'Ancient Egypt' exhibit
  
  // TODO: Record 3 visits to the Dinosaur Bones exhibit
  
  // TODO: Record 2 visits to the Ancient Egypt exhibit
  
  // TODO: Llama a displayStats() en cada exhibit en orden
  
  // TODO: Print total museum visitors using Exhibit.totalVisitors
  // Format: Total museum visitors: [totalVisitors]
}
quiz iconPonte a prueba

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

Practica por tu cuenta: Compilador de Dart online