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.
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
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
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.
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
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
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
{ public class Calculadora { public Calculadora() { } protected internal double Soma(double a, double b) { return a + b; } } } Calculadora.cs myDLL.dll Após com pilar
{ public class Calculadora { public Calculadora() { } protected internal double Soma(double a, double b) { return a + b; } } } Calculadora.cs myDLL.dll Após com pilar
{ 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() ); } } }
{ 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() ); } } }
{ 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?
{ 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
{ 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(); } } }
{ 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.
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