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 el código de manera efectiva.

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 clase misma, no a ningún objeto en particular. Se comparten entre todas las instancias y se accede a ellos utilizando 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. Se accede a ella a través del nombre de la clase Dog.totalDogs, no a través de una instancia.

challenge icon

Desafío

Fácil

Vamos a construir un sistema de conteo de visitantes para un museo que rastree tanto las visitas a exhibiciones individuales como las estadísticas generales del museo.

Organizarás tu código en dos archivos:

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

El método displayStats() debe imprimir en 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

Hoja de referencia

Los miembros de una clase en Dart pueden ser miembros de instancia (que pertenecen a objetos individuales) o miembros estáticos (que pertenecen a la clase misma).

Los miembros de instancia son únicos para cada objeto. Cada objeto tiene su propia copia de las variables de instancia:

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

Los miembros estáticos se comparten entre todas las instancias y se accede a ellos utilizando el nombre de la clase con la palabra clave static:

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

// Acceder a los miembros estáticos a través del nombre de la clase
print(Dog.totalDogs);  // 2

Las variables estáticas mantienen un único valor compartido independientemente de cuántos objetos se creen.

Pruébalo tú mismo

import 'exhibit.dart';

void main() {
  // TODO: Crear una exhibición 'Dinosaur Bones'
  
  // TODO: Crear una exhibición 'Ancient Egypt'
  
  // TODO: Registrar 3 visitas a la exhibición Dinosaur Bones
  
  // TODO: Registrar 2 visitas a la exhibición Ancient Egypt
  
  // TODO: Llamar a displayStats() en cada exhibición en orden
  
  // TODO: Imprimir el total de visitantes del museo usando Exhibit.totalVisitors
  // Formato: 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