Programação Dart - Classes
Dart é uma linguagem orientada a objetos. Ele suporta recursos de programação orientada a objetos, como classes, interfaces, etc. Aclassem termos de OOP é um plano para a criação de objetos. UMAclassencapsula dados para o objeto. O Dart fornece suporte integrado para este conceito chamadoclass.
Declarando uma classe
Use o class palavra-chave para declarar um classem Dart. Uma definição de classe começa com a palavra-chave class seguida pelaclass name; e o corpo da classe delimitado por um par de chaves. A sintaxe para o mesmo é fornecida abaixo -
Sintaxe
class class_name {
<fields>
<getters/setters>
<constructors>
<functions>
}
o classpalavra-chave é seguida pelo nome da classe. As regras para identificadores devem ser consideradas ao nomear uma classe.
Uma definição de classe pode incluir o seguinte -
Fields- Um campo é qualquer variável declarada em uma classe. Os campos representam dados pertencentes a objetos.
Setters and Getters- Permite que o programa inicialize e recupere os valores dos campos de uma classe. Um getter / setter padrão é associado a cada classe. No entanto, os padrões podem ser substituídos definindo explicitamente um setter / getter.
Constructors - responsável por alocar memória para os objetos da classe.
Functions- Funções representam ações que um objeto pode realizar. Às vezes também são chamados de métodos.
Esses componentes juntos são chamados de data members da classe.
Exemplo: Declarando uma classe
class Car {
// field
String engine = "E1001";
// function
void disp() {
print(engine);
}
}
O exemplo declara uma classe Car. A classe tem um campo chamadoengine. odisp() é uma função simples que imprime o valor do campo engine.
Criação de instância da classe
Para criar uma instância da classe, use o newpalavra-chave seguida do nome da classe. A sintaxe para o mesmo é fornecida abaixo -
Sintaxe
var object_name = new class_name([ arguments ])
o new palavra-chave é responsável pela instanciação.
O lado direito da expressão invoca o construtor. O construtor deve receber valores se for parametrizado.
Exemplo: instanciando uma classe
var obj = new Car("Engine 1")
Acessando atributos e funções
Os atributos e funções de uma classe podem ser acessados por meio do objeto. Use o '.' notação de ponto (chamada deperiod) para acessar os membros de dados de uma classe.
//accessing an attribute
obj.field_name
//accessing a function
obj.function_name()
Exemplo
Dê uma olhada no exemplo a seguir para entender como acessar atributos e funções no Dart -
void main() {
Car c= new Car();
c.disp();
}
class Car {
// field
String engine = "E1001";
// function
void disp() {
print(engine);
}
}
o output do código acima é o seguinte -
E1001
Construtores de dardos
Um construtor é uma função especial da classe responsável por inicializar as variáveis da classe. O Dart define um construtor com o mesmo nome da classe. Um construtor é uma função e, portanto, pode ser parametrizado. No entanto, ao contrário de uma função, os construtores não podem ter um tipo de retorno. Se você não declarar um construtor, um padrãono-argument constructor é fornecido para você.
Sintaxe
Class_name(parameter_list) {
//constructor body
}
Exemplo
O exemplo a seguir mostra como usar construtores no Dart -
void main() {
Car c = new Car('E1001');
}
class Car {
Car(String engine) {
print(engine);
}
}
Deve produzir o seguinte output -
E1001
Construtores Nomeados
Dart fornece named constructors para habilitar uma definição de classe multiple constructors. A sintaxe dos construtores nomeados é a seguinte -
Sintaxe: Definindo o construtor
Class_name.constructor_name(param_list)
Exemplo
O exemplo a seguir mostra como você pode usar construtores nomeados no Dart -
void main() {
Car c1 = new Car.namedConst('E1001');
Car c2 = new Car();
}
class Car {
Car() {
print("Non-parameterized constructor invoked");
}
Car.namedConst(String engine) {
print("The engine is : ${engine}");
}
}
Deve produzir o seguinte output -
The engine is : E1001
Non-parameterized constructor invoked
Esta palavra-chave
o thispalavra-chave refere-se à instância atual da classe. Aqui, o nome do parâmetro e o nome do campo da classe são os mesmos. Portanto, para evitar ambigüidade, o campo da classe é prefixado com othispalavra-chave. O exemplo a seguir explica o mesmo -
Exemplo
O exemplo a seguir explica como usar o this palavra-chave no Dart -
void main() {
Car c1 = new Car('E1001');
}
class Car {
String engine;
Car(String engine) {
this.engine = engine;
print("The engine is : ${engine}");
}
}
Deve produzir o seguinte output -
The engine is : E1001
Classe Dart ─ Getters e Setters
Getters e Setters, também chamado de accessors e mutators, permite que o programa inicialize e recupere os valores dos campos de classe, respectivamente. Getters ou acessores são definidos usando ogetpalavra-chave. Setters ou mutadores são definidos usando oset palavra-chave.
Um getter / setter padrão é associado a cada classe. No entanto, os padrões podem ser substituídos definindo explicitamente um setter / getter. Um getter não tem parâmetros e retorna um valor, e o setter tem um parâmetro e não retorna um valor.
Sintaxe: Definindo um getter
Return_type get identifier
{
}
Sintaxe: Definindo um setter
set identifier
{
}
Exemplo
O exemplo a seguir mostra como você pode usar getters e setters em uma aula de Dart -
class Student {
String name;
int age;
String get stud_name {
return name;
}
void set stud_name(String name) {
this.name = name;
}
void set stud_age(int age) {
if(age<= 0) {
print("Age should be greater than 5");
} else {
this.age = age;
}
}
int get stud_age {
return age;
}
}
void main() {
Student s1 = new Student();
s1.stud_name = 'MARK';
s1.stud_age = 0;
print(s1.stud_name);
print(s1.stud_age);
}
Este código de programa deve produzir o seguinte output -
Age should be greater than 5
MARK
Null
Herança de classe
O Dart suporta o conceito de Herança, que é a capacidade de um programa de criar novas classes a partir de uma classe existente. A classe que é estendida para criar classes mais novas é chamada de classe pai / superclasse. As classes recém-criadas são chamadas de classes filhas / subclasses.
Uma classe herda de outra classe usando a palavra-chave 'extends'. Child classes inherit all properties and methods except constructors from the parent class.
Sintaxe
class child_class_name extends parent_class_name
Note - O Dart não oferece suporte a herança múltipla.
Exemplo: herança de classe
No exemplo a seguir, estamos declarando uma classe Shape. A aula é estendida peloCircleclasse. Uma vez que existe uma relação de herança entre as classes, a classe filha, ou seja, a classeCar obtém um acesso implícito ao membro de dados da classe pai.
void main() {
var obj = new Circle();
obj.cal_area();
}
class Shape {
void cal_area() {
print("calling calc area defined in the Shape class");
}
}
class Circle extends Shape {}
Deve produzir o seguinte output -
calling calc area defined in the Shape class
Tipos de herança
A herança pode ser dos três tipos a seguir -
Single - Cada classe pode estender-se, no máximo, de uma classe pai.
Multiple- Uma classe pode herdar de várias classes. O Dart não oferece suporte a herança múltipla.
Multi-level - Uma classe pode herdar de outra classe filha.
Exemplo
O exemplo a seguir mostra como funciona a herança de vários níveis -
void main() {
var obj = new Leaf();
obj.str = "hello";
print(obj.str);
}
class Root {
String str;
}
class Child extends Root {}
class Leaf extends Child {}
//indirectly inherits from Root by virtue of inheritance
A classe Leafderiva os atributos das classes Root e Child em virtude da herança de vários níveis. Estáoutput é o seguinte -
hello
Dart - Herança de Classe e Substituição de Método
Substituição de método é um mecanismo pelo qual a classe filha redefine um método em sua classe pai. O exemplo a seguir ilustra o mesmo -
Exemplo
void main() {
Child c = new Child();
c.m1(12);
}
class Parent {
void m1(int a){ print("value of a ${a}");}
}
class Child extends Parent {
@override
void m1(int b) {
print("value of b ${b}");
}
}
Deve produzir o seguinte output -
value of b 12
O número e o tipo dos parâmetros da função devem corresponder ao substituir o método. Em caso de incompatibilidade no número de parâmetros ou no tipo de dados, o compilador Dart gera um erro. A ilustração a seguir explica o mesmo -
import 'dart:io';
void main() {
Child c = new Child();
c.m1(12);
}
class Parent {
void m1(int a){ print("value of a ${a}");}
}
class Child extends Parent {
@override
void m1(String b) {
print("value of b ${b}");
}
}
Deve produzir o seguinte output -
value of b 12
A palavra-chave estática
o static palavra-chave pode ser aplicada aos membros de dados de uma classe, ou seja, fields e methods. Uma variável estática retém seus valores até que o programa termine a execução. Membros estáticos são referenciados pelo nome da classe.
Exemplo
class StaticMem {
static int num;
static disp() {
print("The value of num is ${StaticMem.num}") ;
}
}
void main() {
StaticMem.num = 12;
// initialize the static variable }
StaticMem.disp();
// invoke the static method
}
Deve produzir o seguinte output -
The value of num is 12
A super palavra-chave
o superpalavra-chave é usada para se referir ao pai imediato de uma classe. A palavra-chave pode ser usada para se referir à versão de superclasse de umvariable, property, ou method. O exemplo a seguir ilustra o mesmo -
Exemplo
void main() {
Child c = new Child();
c.m1(12);
}
class Parent {
String msg = "message variable from the parent class";
void m1(int a){ print("value of a ${a}");}
}
class Child extends Parent {
@override
void m1(int b) {
print("value of b ${b}");
super.m1(13);
print("${super.msg}") ;
}
}
Deve produzir o seguinte output -
value of b 12
value of a 13
message variable from the parent class