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); // 2La 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.
Desafío
FácilConstruyamos 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 claseExhibitque 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 en0para registrar cuántas personas visitaron esta exposición específica - Una variable estática
totalVisitors(int) que comience en0para 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 tantovisitorCountde la exposición comototalVisitorsde la clase - Un método
displayStats()que imprima la información de la exposición
- Una variable de instancia
main.dart: Importa tu clase de exposición y crea dos exposiciones:- Una exposición
'Dinosaur Bones' - Una exposición
'Ancient Egypt'
displayStats()en cada exposición en el orden en que fueron creadas y después imprime el total de visitantes de todas las exposiciones.- Una exposición
El método displayStats() debe imprimir con 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: 5Prué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]
}
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 RepositoryPractica por tu cuenta: Compilador de Dart online