Baixe c# programação e exercicios para progrma e outras Exercícios em PDF para Programação em C, somente na Docsity!
Curso C# Completo
Programação Orientada a
Objetos + Projetos
Capítulo: Construtores, palavra this, sobrecarga, encapsulamento
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Construtores
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Construtor
- É uma operação especial da classe, que executa no momento da
instanciação do objeto
- Usos comuns:
- Iniciar valores dos atributos
- Permitir ou obrigar que o objeto receba dados / dependências no momento de sua instanciação (injeção de dependência)
- Se um construtor customizado não for especificado, a classe disponibiliza o
construtor padrão:
- Produto p = new Produto();
- É possível especificar mais de um construtor na mesma classe (sobrecarga)
Exemplo:
Entre os dados do produto:
Nome: TV
Preço: 900.
Quantidade no estoque: 10
Dados do produto: TV, $ 900.00, 10 unidades, Total: $ 9000.
Digite o número de produtos a ser adicionado ao estoque: 5
Dados atualizados: TV, $ 900.00, 15 unidades, Total: $ 13500.
Digite o número de produtos a ser removido do estoque: 3
Dados atualizados: TV, $ 900.00, 12 unidades, Total: $ 10800.
Quando executamos o comando abaixo, instanciamos um produto " p " com seus
atributos “vazios”:
p = new Produto();
Entretanto, faz sentido um produto que não tem nome? Faz sentido um produto que
não tem preço?
Com o intuito de evitar a existência de produtos sem nome e sem preço, é possível
fazer com que seja “obrigatória” a iniciação desses valores?
Memória:
Proposta de melhoria
null 0.0 0
Nome Preco Quantidade
p
using System.Globalization;
namespace Course { class Produto {
public string Nome; public double Preco; public int Quantidade;
public Produto(string nome, double preco, int quantidade) { Nome = nome; Preco = preco; Quantidade = quantidade; }
public double ValorTotalEmEstoque() { return Preco * Quantidade; }
public void AdicionarProdutos(int quantidade) { Quantidade += quantidade; }
public void RemoverProdutos(int quantidade) { Quantidade -= quantidade; }
public override string ToString() { return Nome
- ", $ "
- Preco.ToString("F2", CultureInfo.InvariantCulture)
- ", "
- Quantidade
- " unidades, Total: $ "
- ValorTotalEmEstoque().ToString("F2", CultureInfo.InvariantCulture); } } }
using System; using System.Globalization;
namespace Course { class Program { static void Main(string[] args) {
Console.WriteLine("Entre os dados do produto:"); Console.Write("Nome: "); string nome = Console.ReadLine(); Console.Write("Preço: "); double preco = double.Parse(Console.ReadLine(), CultureInfo.InvariantCulture); Console.Write("Quantidade no estoque: "); int quantidade = int.Parse(Console.ReadLine());
Produto p = new Produto(nome, preco, quantidade);
Console.WriteLine(); Console.WriteLine("Dados do produto: " + p);
Console.WriteLine(); Console.Write("Digite o número de produtos a ser adicionado ao estoque: "); int qte = int.Parse(Console.ReadLine()); p.AdicionarProdutos(qte);
Console.WriteLine(); Console.WriteLine("Dados atualizados: " + p);
Console.WriteLine(); Console.Write("Digite o número de produtos a ser removido do estoque: "); qte = int.Parse(Console.ReadLine()); p.RemoverProdutos(qte);
Console.WriteLine(); Console.WriteLine("Dados atualizados: " + p); } } }
Sobrecarga
http://educandoweb.com.br
Prof. Dr. Nelio Alves
public Produto() {
}
public Produto(string nome, double preco, int quantidade) {
Nome = nome;
Preco = preco;
Quantidade = quantidade;
}
public Produto(string nome, double preco) {
Nome = nome;
Preco = preco; Quantidade = 0;
}
Sintaxe alternativa para inicializar
valores
http://educandoweb.com.br
Prof. Dr. Nelio Alves
using System.Globalization;
namespace Course {
class Produto {
public string Nome;
public double Preco;
public int Quantidade;
public Produto() {
public Produto(string nome, double preco, int quantidade) {
Nome = nome;
Preco = preco;
Quantidade = quantidade;
Produto p = new Produto("TV", 900.00, 10);
Produto p = new Produto {
Nome = "TV",
Preco = 900.0,
Quantidade = 0
Produto p2 = new Produto() {
Nome = "TV",
Preco = 900.0,
Quantidade = 0
Isso funciona mesmo se a classe não possuir construtores implementados
Diferenciar atributos de variáveis locais
public Produto(string Nome, double Preco) {
this.Nome = Nome;
this.Preco = Preco;
Quantidade = 0;
Memória
Stack Heap
Nome Preco Quantidade
(escopo do construtor)
"TV"
Preco
Nome
Produto p = new Produto("TV", 1500.0);
p "TV" 1500.0 0
using System.Globalization;
namespace Course {
class Produto {
public string Nome;
public double Preco;
public int Quantidade;
public Produto() {
Quantidade = 0;
public Produto(string nome, double preco) : this() {
Nome = nome;
Preco = preco;
public Produto(string nome, double preco, int quantidade) : this(nome, preco) {
Quantidade = quantidade;
Referenciar outro construtor em um construtor
Passar o próprio objeto como argumento na
chamada de um método ou construtor
class ChessMatch {
PlaceNewPiece('e', 1, new King(board, Color.White, this));
Encapsulamento
http://educandoweb.com.br
Prof. Dr. Nelio Alves
using System.Globalization;
namespace Course {
class Produto {
private string _nome;
private double _preco;
private int _quantidade;
public Produto() {
public Produto(string nome, double preco, int quantidade) {
_nome = nome;
_preco = preco;
_quantidade = quantidade;
public string GetNome() {
return _nome;
public void SetNome(string nome) {
if (nome != null && nome.Length > 1) {
_nome = nome;
public double GetPreco() {
return _preco;
public int GetQuantidade() {
return _quantidade;
public double ValorTotalEmEstoque() {
return _preco * _quantidade;
public void AdicionarProdutos(int quantidade) {
_quantidade += quantidade;
public void RemoverProdutos(int quantidade) {
_quantidade -= quantidade;
public override string ToString() {
return _nome
+ _preco.ToString("F2", CultureInfo.InvariantCulture)
+ _quantidade
+ " unidades, Total: $ "
+ ValorTotalEmEstoque().ToString("F2", CultureInfo.InvariantCulture);
Properties
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Propriedades
• São definições de métodos encapsulados, porém expondo uma
sintaxe similar à de atributos e não de métodos
- https://docs.microsoft.com/pt-br/dotnet/csharp/programming-guide/classes-and-structs/properties
- Uma propriedade é um membro que oferece um mecanismo flexível para ler,
gravar ou calcular o valor de um campo particular. As propriedades podem ser
usadas como se fossem atributos públicos, mas na verdade elas são métodos
especiais chamados "acessadores". Isso permite que os dados sejam
acessados facilmente e ainda ajuda a promover a segurança e a flexibilidade
dos métodos.
Auto Properties
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Propriedades autoimplementadas
• É uma forma simplificada de se declarar propriedades que não
necessitam lógicas particulares para as operações get e set.
https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/auto-implemented-properties
public double Preco { get; private set; }
using System.Globalization;
namespace Course {
class Produto {
private string _nome;
public double Preco { get; private set; }
public double Quantidade { get; set; }
public Produto() {
public Produto(string nome, double preco, int quantidade) {
_nome = nome;
Preco = preco;
Quantidade = quantidade;
public string Nome {
get { return _nome; }
set {
if (value != null && value.Length > 1) {
_nome = value;
public double ValorTotalEmEstoque {
get { return Preco * Quantidade; }
public void AdicionarProdutos(int quantidade) {
Quantidade += quantidade;
public void RemoverProdutos(int quantidade) {
Quantidade -= quantidade;
public override string ToString() {
return _nome
+ Preco.ToString("F2", CultureInfo.InvariantCulture)
+ Quantidade
+ " unidades, Total: $ "
+ ValorTotalEmEstoque.ToString("F2", CultureInfo.InvariantCulture);
Modificadores e acesso
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Modificadores de acesso
• https://docs.microsoft.com/en-us/dotnet/csharp/language-
reference/keywords/access-modifiers
Membros
própria classe
subclasses no assembly
classes do assembly
subclasses fora do assembly
classes fora do assembly
public x x x x x
protected internal x x x x
internal x x x
protected x x x
private protected x x
private x
Classes
- Acesso por qualquer classe
- Acesso somente dentro do assembly
- internal class Product
- class Product
- Acesso somente pela classe-mãe
- private class Product
- Nota: classe aninhada, por padrão, é private