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); // 2La 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.
Desafío
FácilVamos 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 claseExhibitque 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 en0para rastrear cuántas personas visitaron esta exhibición específica - Una variable estática
totalVisitors(int) que comience en0para 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 elvisitorCountde la exhibición como eltotalVisitorsde la clase - Un método
displayStats()que imprima la información de la exhibición
- Una variable de instancia
main.dart: Importa tu clase de exhibición y crea dos exhibiciones:- Una exhibición
'Dinosaur Bones' - Una exhibición
'Ancient Egypt'
displayStats()en cada exhibición en el orden en que fueron creadas, luego imprime el total de visitantes en todas las exhibiciones.- Una exhibición
El método displayStats() debe imprimir en este formato exacto:
[name]: [visitorCount] visitorsPara 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: 5Hoja 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); // 2Las 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]
}
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 POO
Archivos externosLibrerías e importacionesIntroducción a la POOClases vs. ObjetosLa palabra clave thisMétodosVariables de instanciaConceptos básicos de constructoresResumen - Calculadora sencilla4Seguridad de nulos
Introducción a la seguridad de nulosNulables vs No nulablesLos operadores ? y !Palabra clave Late y Null SafetyOperadores Null-awareNull Safety en clasesResumen - Sistema de perfil de usuario7Clases abstractas e interfaces
Clases abstractasMétodos abstractosInterfaces en DartInterfaces implícitasImplementar vs. ExtenderInterfaces múltiplesRepaso - Calculadora de figuras10Colecciones y Genéricos
Visión general de List, Set y MapColecciones con seguridad de tiposClases genéricasMétodos genéricosRestricciones genéricasIterable e IteratorResumen - Almacenamiento genérico2Constructores en Dart
Constructor por defectoConstructores nombradosListas de inicializaciónConstructores constantesConstructores de fábricaConstructores de redireccionamientoResumen - Constructor de formas5Encapsulamiento
Miembros públicos vs. privadosLa convención del prefijo _Privacidad a nivel de libreríaProfundidad en Getters y SettersOcultamiento de informaciónResumen - Registros de estudiantes8Mixins
Introducción a los MixinsCreación de MixinsUso de múltiples MixinsPalabra clave on en MixinsMixin vs HerenciaMixin vs InterfazResumen - Sistema Animal11Métodos especiales
Sobrescritura de toString()Sobrescritura de hashCode y ==Interfaz ComparableMétodo call()Sobrescritura de noSuchMethodResumen - Colección personalizada14Patrones de diseño Parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón Strategy3Propiedades de clase
Miembros de instancia vs. estáticosCampos Final y ConstVariables LateMétodos y campos estáticosGetters y SettersResumen - Gestor de cuentas bancarias6Herencia
Herencia básicaLa palabra clave superSobrescritura de métodosLa anotación @overrideLa palabra clave final en clasesConstructores y herenciaResumen - Jerarquía de empleados9Polimorfismo
Fundamentos del polimorfismoPolimorfismo mediante interfacesComprobación de tipos en tiempo de ejecuciónLos operadores is y asPalabra clave covariantResumen - Procesador de pagos12POO Asíncrona
Futures y async/awaitFundamentos de StreamsStream ControllersConstructores asíncronosAsincronía en métodos de claseRepaso - Data Fetcher15Patrones de diseño Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositePatrón Repository