Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Programação Modular | Modificadores de Acesso

Programação Modular | Modificadores de Acesso

Slides utilizados em aula na disciplina Programação Modular do Instituto de Ciências Exatas e Informática - Sistemas de Informação. Pontifícia Universidade Católica de Minas Gerais - Unidade Barreiro, 1º Semestre 2015.

Eduardo Miranda

March 12, 2015
Tweet

More Decks by Eduardo Miranda

Other Decks in Education

Transcript

  1. O que é um assembly em C#? Assembly é um

    arquivo que é gerado automaticamente pelo compilador em uma compilação bem-sucedida. Ele pode ser qualquer arquivo executável ou uma Dynamic Link Library (DLL). Ele é gerado apenas uma vez e após cada compilação posterior ele é atualizado. Todo o processo será executado em segundo plano da sua aplicação. modificadores de acesso
  2. O que é um módulo em C#? Módulo é uma

    coleção lógica de código em um assembly. Você pode ter múltiplos módulos em um assembly e cada módulo pode ser escrito em diferentes linguagens .NET. modificadores de acesso Métodos Classes Módulos Assembly
  3. Todos os tipos e membros de tipo têm um nível

    de acessibilidade que assegura se eles podem ser usados no seu assembly ou em outro assembly. Em C# os seguintes modificadores de acesso podem ser utilizados para especificar a acessibilidade de um tipo ou membro: modificadores de acesso public O tipo ou membro pode ser acessado no seu assembly ou em outro assembly que o referencia. private O tipo ou membro pode ser acessado somente na mesma classe ou struct. protected O tipo ou membro pode ser acessado somente pelo código na mesma classe ou struct, ou em uma classe que é derivada dessa classe. internal O tipo ou membro pode ser acessado no mesmo assembly mas não pode ser acessado por outro assembly. protected internal O tipo ou membro pode ser acessado por qualquer código no mesmo assembly em que é declarado, ou a partir de uma classe derivada de outro assembly. Acesso a partir de outro assembly deve ocorrer dentro de uma declaração de classe que deriva da classe em que o elemento protected internal é declarado.
  4. class Veiculo { public String _tipoVeiculo; protected int _TotalRodas; private

    int _TotalPortas; public Veiculo(String tipoVeiculo, int TotalRodas, int TotalPortas ) { this._tipoVeiculo = tipoVeiculo; this._TotalRodas = TotalRodas; this._TotalPortas = TotalPortas; } } class Carro : Veiculo { public Carro(String tipoVeiculo, int TotalRodas, int TotalPortas) : base(tipoVeiculo, TotalRodas, TotalPortas) { } public void Imprimir() { //Console.WriteLine("Tipo do veiculo: {0}", this._tipoVeiculo ); //Console.WriteLine("Total de rodas: {0}", this._TotalRodas); //Console.WriteLine("Total de portas: {0}", this_TotalPortas); } } class Program { static void Main() { Carro fusca = new Carro("Fusca", 4,2); fusca.Imprimir(); } }
  5. class Veiculo { public String _tipoVeiculo; protected int _TotalRodas; private

    int _TotalPortas; public Veiculo(String tipoVeiculo, int TotalRodas, int TotalPortas ) { this._tipoVeiculo = tipoVeiculo; this._TotalRodas = TotalRodas; this._TotalPortas = TotalPortas; } } class Carro : Veiculo { public Carro(String tipoVeiculo, int TotalRodas, int TotalPortas) : base(tipoVeiculo, TotalRodas, TotalPortas) { } public void Imprimir() { //Console.WriteLine("Tipo do veiculo: {0}", this._tipoVeiculo ); //Console.WriteLine("Total de rodas: {0}", this._TotalRodas); //Console.WriteLine("Total de portas: {0}", this_TotalPortas); } } class Program { static void Main() { Carro fusca = new Carro("Fusca", 4,2); fusca.Imprimir(); } } Saída correta:
  6. class Veiculo { public String _tipoVeiculo; protected int _TotalRodas; private

    int _TotalPortas; public Veiculo(String tipoVeiculo, int TotalRodas, int TotalPortas ) { this._tipoVeiculo = tipoVeiculo; this._TotalRodas = TotalRodas; this._TotalPortas = TotalPortas; } } class Carro : Veiculo { public Carro(String tipoVeiculo, int TotalRodas, int TotalPortas) : base(tipoVeiculo, TotalRodas, TotalPortas) { } public void Imprimir() { Console.WriteLine("Tipo do veiculo: {0}", this._tipoVeiculo ); //Console.WriteLine("Total de rodas: {0}", this._TotalRodas); //Console.WriteLine("Total de portas: {0}", this_TotalPortas); } } class Program { static void Main() { Carro fusca = new Carro("Fusca", 4,2); fusca.Imprimir(); } }
  7. class Veiculo { public String _tipoVeiculo; protected int _TotalRodas; private

    int _TotalPortas; public Veiculo(String tipoVeiculo, int TotalRodas, int TotalPortas ) { this._tipoVeiculo = tipoVeiculo; this._TotalRodas = TotalRodas; this._TotalPortas = TotalPortas; } } class Carro : Veiculo { public Carro(String tipoVeiculo, int TotalRodas, int TotalPortas) : base(tipoVeiculo, TotalRodas, TotalPortas) { } public void Imprimir() { Console.WriteLine("Tipo do veiculo: {0}", this._tipoVeiculo ); //Console.WriteLine("Total de rodas: {0}", this._TotalRodas); //Console.WriteLine("Total de portas: {0}", this_TotalPortas); } } class Program { static void Main() { Carro fusca = new Carro("Fusca", 4,2); fusca.Imprimir(); } } Saída correta: Tipo do veiculo: Fusca
  8. class Veiculo { public String _tipoVeiculo; protected int _TotalRodas; private

    int _TotalPortas; public Veiculo(String tipoVeiculo, int TotalRodas, int TotalPortas ) { this._tipoVeiculo = tipoVeiculo; this._TotalRodas = TotalRodas; this._TotalPortas = TotalPortas; } } class Carro : Veiculo { public Carro(String tipoVeiculo, int TotalRodas, int TotalPortas) : base(tipoVeiculo, TotalRodas, TotalPortas) { } public void Imprimir() { Console.WriteLine("Tipo do veiculo: {0}", this._tipoVeiculo ); Console.WriteLine("Total de rodas: {0}", this._TotalRodas); //Console.WriteLine("Total de portas: {0}", this_TotalPortas); } } class Program { static void Main() { Carro fusca = new Carro("Fusca", 4,2); fusca.Imprimir(); } }
  9. class Veiculo { public String _tipoVeiculo; protected int _TotalRodas; private

    int _TotalPortas; public Veiculo(String tipoVeiculo, int TotalRodas, int TotalPortas ) { this._tipoVeiculo = tipoVeiculo; this._TotalRodas = TotalRodas; this._TotalPortas = TotalPortas; } } class Carro : Veiculo { public Carro(String tipoVeiculo, int TotalRodas, int TotalPortas) : base(tipoVeiculo, TotalRodas, TotalPortas) { } public void Imprimir() { Console.WriteLine("Tipo do veiculo: {0}", this._tipoVeiculo ); Console.WriteLine("Total de rodas: {0}", this._TotalRodas); //Console.WriteLine("Total de portas: {0}", this_TotalPortas); } } class Program { static void Main() { Carro fusca = new Carro("Fusca", 4,2); fusca.Imprimir(); } } Saída correta: Tipo do veiculo: Fusca Total de rodas: 4
  10. class Veiculo { public String _tipoVeiculo; protected int _TotalRodas; private

    int _TotalPortas; public Veiculo(String tipoVeiculo, int TotalRodas, int TotalPortas ) { this._tipoVeiculo = tipoVeiculo; this._TotalRodas = TotalRodas; this._TotalPortas = TotalPortas; } } class Carro : Veiculo { public Carro(String tipoVeiculo, int TotalRodas, int TotalPortas) : base(tipoVeiculo, TotalRodas, TotalPortas) { } public void Imprimir() { Console.WriteLine("Tipo do veiculo: {0}", this._tipoVeiculo ); Console.WriteLine("Total de rodas: {0}", this._TotalRodas); Console.WriteLine("Total de portas: {0}", this._TotalPortas); } } class Program { static void Main() { Carro fusca = new Carro("Fusca", 4,2); fusca.Imprimir(); } }
  11. class Veiculo { public String _tipoVeiculo; protected int _TotalRodas; private

    int _TotalPortas; public Veiculo(String tipoVeiculo, int TotalRodas, int TotalPortas ) { this._tipoVeiculo = tipoVeiculo; this._TotalRodas = TotalRodas; this._TotalPortas = TotalPortas; } } class Carro : Veiculo { public Carro(String tipoVeiculo, int TotalRodas, int TotalPortas) : base(tipoVeiculo, TotalRodas, TotalPortas) { } public void Imprimir() { Console.WriteLine("Tipo do veiculo: {0}", this._tipoVeiculo ); Console.WriteLine("Total de rodas: {0}", this._TotalRodas); Console.WriteLine("Total de portas: {0}", this._TotalPortas); } } class Program { static void Main() { Carro fusca = new Carro("Fusca", 4,2); fusca.Imprimir(); } } 'Veiculo._TotalPortas' is inaccessible due to its protection level
  12. using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace myDLL

    { public class Calculadora { public Calculadora() { } protected internal double Soma(double a, double b) { return a + b; } } } Calculadora.cs
  13. using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace myDLL

    { public class Calculadora { public Calculadora() { } protected internal double Soma(double a, double b) { return a + b; } } } Calculadora.cs myDLL.dll Após com pilar
  14. using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace myDLL

    { public class Calculadora { public Calculadora() { } protected internal double Soma(double a, double b) { return a + b; } } } Calculadora.cs myDLL.dll Após com pilar
  15. using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace UsandoDLL

    { public class Cientifica : myDLL.Calculadora { public Cientifica() { } public double SomaCientifica(double a, double b) { return base.Soma(a,b); } } class Program { static void Main(string[] args) { Cientifica cient = new Cientifica(); Console.WriteLine( cient.SomaCientifica( 10 , 20 ).ToString() ); } } }
  16. using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace UsandoDLL

    { public class Cientifica : myDLL.Calculadora { public Cientifica() { } public double SomaCientifica(double a, double b) { return base.Soma(a,b); } } class Program { static void Main(string[] args) { Cientifica cient = new Cientifica(); Console.WriteLine( cient.SomaCientifica( 10 , 20 ).ToString() ); } } }
  17. using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace UsandoDLL

    { public class Cientifica : myDLL.Calculadora { public Cientifica() { } public double SomaCientifica(double a, double b) { return base.Soma(a,b); } } class Program { static void Main(string[] args) { Cientifica cient = new Cientifica(); Console.WriteLine( cient.Soma( 10 , 20 ).ToString() ); } } } Não estamos mais chamando o método SomaCientifica e sim o método Soma. O que acontece?
  18. using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace UsandoDLL

    { public class Cientifica : myDLL.Calculadora { public Cientifica() { } public double SomaCientifica(double a, double b) { return base.Soma(a,b); } } class Program { static void Main(string[] args) { Cientifica cient = new Cientifica(); Console.WriteLine( cient.Soma( 10 , 20 ).ToString() ); } } } Não estamos mais chamando o método SomaCientifica e sim o método Soma. O que acontece? 'myDLL.Calculadora.Soma(double, double)' is inaccessible due to its protection level
  19. using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace UsandoDLL

    { public class Calculadora { public Calculadora() { } ##### double Soma(double a, double b) { return a + b; } } public class Cientifica : Calculadora { public Cientifica() { } public double SomaCientifica(double a, double b) { return base.Soma(a,b); } } class Program { static void Main(string[] args) { Cientifica calc = new Cientifica(); Console.WriteLine(calc.Soma(10, 20).ToString()); Console.ReadKey(); } } }
  20. using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace UsandoDLL

    { public class Calculadora { public Calculadora() { } ##### double Soma(double a, double b) { return a + b; } } public class Cientifica : Calculadora { public Cientifica() { } public double SomaCientifica(double a, double b) { return base.Soma(a,b); } } class Program { static void Main(string[] args) { Cientifica calc = new Cientifica(); Console.WriteLine(calc.Soma(10, 20).ToString()); Console.ReadKey(); } } } Substituindo ##### por • public • internal • protected internal O código compila sem problemas porque as duas classes Calculadora e Cientifica estão no mesmo assembly.
  21. modificadores de acesso Acesso de dentro da mesma classe Acesso

    através de uma classe derivada Acesso de dentro do mesmo assembly Acesso a partir de outro assembly public ✓ ✓ ✓ ✓ protected internal ✓ ✓ ✓ X protected ✓ ✓ X X private ✓ X X X internal ✓ X ✓ X