Membros de Instância vs. Estáticos
Parte da seção Programação Orientada a Objetos do Journey de Dart da Coddy. Lição 17 de 110.
Nas classes do Dart, os membros (variáveis e métodos) podem pertencer a objetos individuais ou à própria classe. Entender essa distinção é fundamental para organizar seu código de maneira eficaz.
Membros de instância pertencem a cada objeto que você cria. Cada objeto recebe sua própria cópia das variáveis de instância, e os métodos de instância operam nos dados desse objeto específico:
class Dog {
String name; // Variável de instância
Dog(this.name);
void bark() { // Método de instância
print('$name says woof!');
}
}
Dog dog1 = Dog('Buddy');
Dog dog2 = Dog('Max');
dog1.bark(); // Buddy diz woof!
dog2.bark(); // Max diz woof!Cada objeto Dog tem seu próprio name. Alterar o name de um cão não afeta o outro.
Membros estáticos pertencem à própria classe, não a nenhum objeto específico. Eles são compartilhados entre todas as instâncias e acessados usando o nome da classe:
class Dog {
String name;
static int totalDogs = 0; // Variável estática
Dog(this.name) {
totalDogs++;
}
}
Dog dog1 = Dog('Buddy');
Dog dog2 = Dog('Max');
print(Dog.totalDogs); // 2A variável totalDogs é compartilhada — há apenas uma cópia, independentemente de quantos objetos Dog existam. Você a acessa por meio do nome da classe Dog.totalDogs, não por meio de uma instância.
Desafio
FácilVamos criar um sistema de contagem de visitantes para um museu que registre tanto as visitas individuais às exposições quanto as estatísticas gerais do museu.
Você organizará seu código em dois arquivos:
exhibit.dart: defina uma classeExhibitque represente uma exposição do museu. Cada exposição deve ter:- Uma variável de instância
name(String) para o nome da exposição - Uma variável de instância
visitorCount(int) começando em0para registrar quantas pessoas visitaram essa exposição específica - Uma variável estática
totalVisitors(int) começando em0para registrar o total de visitas em todas as exposições - Um construtor que receba o nome da exposição
- Um método
recordVisit()que incremente tanto ovisitorCountda exposição quanto ototalVisitorsda classe - Um método
displayStats()que imprima as informações da exposição
- Uma variável de instância
main.dart: importe sua classe de exposição e crie duas exposições:- Uma exposição
'Dinosaur Bones' - Uma exposição
'Ancient Egypt'
displayStats()em cada exposição na ordem em que foram criadas e, em seguida, imprima o total de visitantes em todas as exposições.- Uma exposição
O método displayStats() deve imprimir neste formato exato:
[name]: [visitorCount] visitorsPara a linha do total de visitantes, imprima:
Total museum visitors: [totalVisitors]Acesse a variável estática usando o nome da classe Exhibit.totalVisitors.
Saída esperada:
Dinosaur Bones: 3 visitors
Ancient Egypt: 2 visitors
Total museum visitors: 5Experimente você mesmo
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: Chame displayStats() em cada exhibit em ordem
// TODO: Print total museum visitors using Exhibit.totalVisitors
// Format: Total museum visitors: [totalVisitors]
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação Orientada a Objetos
1Fundamentos de OOP
Arquivos externosBibliotecas e importsIntrodução à OOPClasses vs. objetosA palavra-chave thisMétodosVariáveis de instânciaNoções básicas de construtoresRevisão - Calculadora simples4Segurança contra nulos
Introdução à segurança contra nulosAnulável vs. não anulávelOs operadores ? e !Palavra-chave Late e segurança contra nulosOperadores conscientes de nulosSegurança contra nulos em classesRecapitulação — Sistema de perfil de usuário7Classes Abstratas e Interfaces
Classes AbstratasMétodos AbstratosInterfaces em DartInterfaces ImplícitasImplementação vs. ExtensãoMúltiplas InterfacesRecapitulação - Calculadora de Formas10Coleções e Genéricos
Visão geral de List, Set e MapColeções com segurança de tiposClasses genéricasMétodos genéricosRestrições genéricasIterable e IteratorRecapitulação - Armazenamento genérico13Conceitos Avançados de OOP
Composição vs. HerançaMétodos de ExtensãoClasses ChamáveisClasses Seladas (Dart 3)Registros (Dart 3)Padrões e Correspondência (3.0)Enums com Métodos16Projeto: Gerenciamento de Biblioteca
Visão Geral do ProjetoClasses de Livros e Usuários2Construtores em Dart
Construtor padrãoConstrutores nomeadosListas de inicializaçãoConstrutores constantesConstrutores factoryConstrutores de redirecionamentoRevisão - Construtor de formas5Encapsulamento
Membros Públicos vs. PrivadosConvenção do Prefixo _Privacidade no Nível da BibliotecaAprofundamento em Getters e SettersOcultação de InformaçõesRecapitulação - Registros de Alunos8Mixins
Introdução a MixinsCriando MixinsUsando vários MixinsPalavra-chave on em MixinsMixin vs HerançaMixin vs InterfaceRecapitulação - Sistema de Animais11Métodos Especiais
Sobrescrita de toString()Sobrescrita de hashCode e ==Interface ComparableMétodo call()Sobrescrita de noSuchMethodRecapitulação - Coleção Personalizada14Padrões de Projeto – Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão ObserverPadrão Strategy3Propriedades de Classe
Membros de Instância vs. EstáticosCampos Final e ConstVariáveis LateMétodos e Campos EstáticosGetters e SettersRecapitulação - Gerenciador de Contas Bancárias6Herança
Herança BásicaA Palavra-chave superSobrescrita de MétodosA Anotação @overrideA Palavra-chave final para ClassesConstrutores e HerançaRecapitulação - Hierarquia de Funcionários9Polimorfismo
Fundamentos do polimorfismoPolimorfismo por meio de interfacesVerificação de tipos em tempo de execuçãoOs operadores is e asPalavra-chave covarianteRecapitulação — Processador de pagamentos12OOP Assíncrona
Futures e async/awaitNoções básicas de StreamsControladores de StreamConstrutores assíncronosAsync em métodos de classeRecapitulação — Buscador de dados15Padrões de Projeto — Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão CompositePadrão RepositoryPratique por conta própria: Compilador de Dart online