Encapsulamento de variável de classe abstrata. #65
Replies: 1 comment
-
Olá, @brunos0. Primeiramente, quando for postar código, por favor, use a formatação para que fique fácil de entender: void main() {
Xpto xyz = SeiLa();
xyz.executarMetodo1();
xyz.executarMetodo2();
print(xyz._valor1);
xyz._valor1 = 34;
print(xyz._valor1);
}
abstract class Xpto {
late int _valor1;
late String _texto1;
int get gval1;
String get gtxt1;
void set sval1(int a);
void set stxt1(String b);
void executarMetodo1();
void executarMetodo2() {
print("Xpto metodo2");
}
}
class SeiLa implements Xpto {
int _valor1 = 10;
String _texto1 = "X";
bool _logic1 = false;
int get gval1 {
return this._valor1;
}
String get gtxt1 {
return this._texto1;
}
set sval1(int a) {
this._valor1 = a;
}
set stxt1(String b) {
this._texto1 = b;
}
void executarMetodo1() {
print("Seila metodo1");
}
void executarMetodo2() {
print("Seila metodo2");
}
} Vamos às dúvidas.
Pode ser, ou não. Encapsulamento pode ser entendido de duas forma:
Nesse caso, você está se referindo ao primeiro entendimento, o que está certo.
O conceito de "privado", em Dart, diz respeito à privacidade dentro de uma biblioteca. O escopo da biblioteca é o de um só arquivo. Isso significa que, se a definição do nome ( Observe a seção 6.2 da especificação atual da linguagem Dart:
Não entendi bem o que você quis dizer.
A classe Segue um link com mais detalhes sobre esse assunto: https://medium.com/@manoelsrs/dart-extends-vs-implements-vs-with-96abd515f04e |
Beta Was this translation helpful? Give feedback.
-
Bom dia Galera.
Estou aprendendo Dart e estou estudando no momento sobre Polimorfismo e bateu uma dúvida. Criei uma classe "Modelo" Abstrata, declarei uma variável com um underscore " _ " e isso em classes convencionais tornam a variável "private", só sendo possíveis acessar o conteúdo delas dentro da classe que a originou. Corrijam me se estiver enganado, mas isso seria o tal do encapsulamento, que daria uma maior segurança na leitura e na manipulação das variáveis.
Criei também uma classe "Especializada" com o uso da palavra "implements" apontando a classe modelo. Dessa forma eu tive que definir os métodos gets, sets, e os demais métodos. Quando criei a função main e instanciei um objeto do tipo "Modelo" com o construtor da classe "Especializada", eu consegui acessar o conteúdo diretamente da variável "private" e manipular o conteúdo da variável sem passar pelos gets/sets. Venho de uma linguagem totalmente procedural então estou apanhando um pouco com o Dart, mas estou achando muito maneiro a linguagem. :D
Outra coisa que achei estranho foi: na classe "Especializada", criei uma variável "private" e um método exclusivo. Quando instanciei o objeto do jeito acima, não consegui acessar nem o método nem a variável criada. Só consegui acessar a variável e o método, chamado o nome da classe como se fosse uma função e colocando o sinal de ponto " . " juntamente com o nome da variável (que eu também acho que não deveria ser possível acessar pois ela também tem o _ no nome) ou o nome do método.
Ultima coisinha ( eu prometo ). Tentei especificar o método2 na classe "Especializada", mas tentando aproveitar uma eventual operação da classe "Modelo", mas não consegui, nem usando a palavra @OverRide com a super.executarMetodo2() ou Xpto.executarMetodo2().
Esse comportamento está correto? Se sim, como encapsular as variáveis de classes abstratas/classes que implementam classes abstratas? Como posso acessar variáveis/métodos das classes "Especialializadas"?
Vou deixar o código que eu fiz para vocês darem pitaco de como eu posso ajustar meu código:
void main (){
Xpto xyz = SeiLa();
xyz.executarMetodo1();
xyz.executarMetodo2();
print(xyz._valor1);
xyz._valor1 = 34 ;
print(xyz._valor1);
}
abstract class Xpto{
late int _valor1;
late String _texto1;
int get gval1;
String get gtxt1;
void set sval1 (int a);
void set stxt1 (String b);
void executarMetodo1();
void executarMetodo2(){ print("Xpto metodo2"); }
}
class SeiLa implements Xpto{
int _valor1 = 10;
String _texto1 = "X";
bool _logic1 = false;
int get gval1 {
return this._valor1;
}
String get gtxt1 {
return this._texto1;
}
set sval1 (int a){
this._valor1 = a;
}
set stxt1 (String b){
this._texto1 = b;
}
void executarMetodo1(){
print("Seila metodo1");
}
void executarMetodo2(){
print("Seila metodo2");
}
}
Obrigado por tirar essas pequenas dúvidas desse pobre Padawan.
Bruno$0
Beta Was this translation helpful? Give feedback.
All reactions