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

Programação Modular | Método Virtual, Classe Abstrata, Interface, Classe e Métodos Sealed, Ampliação e modificador New

Programação Modular | Método Virtual, Classe Abstrata, Interface, Classe e Métodos Sealed, Ampliação e modificador New

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

February 28, 2015
Tweet

More Decks by Eduardo Miranda

Other Decks in Education

Transcript

  1. Programação Modular Pontifícia Universidade Católica de Minas Gerais Unidade Barreiro

    — 1º Semestre 2015 Prof. Eduardo Miranda [email protected] Método Virtual, Classe Abstrata, Interface, Classe e Métodos Sealed, Ampliação e modificador New
  2. Método virtual Método virtuais são métodos cujo comportamento podem ser

    sobrescritos em uma classe herdeira por métodos com a mesma assinatura.
  3. exemplo de método virtual using System; class A { public

    void F() { Console.WriteLine("A.F"); } public virtual void G() { Console.WriteLine("A.G"); } } class B: A { new public void F() { Console.WriteLine("B.F"); } public override void G() { Console.WriteLine("B.G"); } } class Test { static void Main() { B b = new B(); A a = b; a.F(); b.F(); a.G(); b.G(); } }
  4. using System; class A { public void F() { Console.WriteLine("A.F");

    } public virtual void G() { Console.WriteLine("A.G"); } } class B: A { new public void F() { Console.WriteLine("B.F"); } public override void G() { Console.WriteLine("B.G"); } } class Test { static void Main() { B b = new B(); A a = b; a.F(); b.F(); a.G(); b.G(); } } exemplo de método virtual Declarando o método virtual
  5. using System; class A { public void F() { Console.WriteLine("A.F");

    } public virtual void G() { Console.WriteLine("A.G"); } } class B: A { new public void F() { Console.WriteLine("B.F"); } public override void G() { Console.WriteLine("B.G"); } } class Test { static void Main() { B b = new B(); A a = b; a.F(); b.F(); a.G(); b.G(); } } exemplo de método virtual Declarando o método virtual sobrescreendo o método virtual
  6. using System; class A { public void F() { Console.WriteLine("A.F");

    } public virtual void G() { Console.WriteLine("A.G"); } } class B: A { new public void F() { Console.WriteLine("B.F"); } public override void G() { Console.WriteLine("B.G"); } } class Test { static void Main() { B b = new B(); A a = b; a.F(); b.F(); a.G(); b.G(); } } exemplo de método virtual Declarando o método virtual sobrescreendo o método virtual Saída correta: A.F B.F B.G B.G
  7. Classe abstrata A classe abstrata é sempre uma superclasse que

    não possui instâncias. Ela define um template para uma funcionalidade
  8. abstract class ShapesClass { abstract public int Area(); } class

    Square : ShapesClass { int side = 0; public Square(int n) { side = n; } // Método Area é necessário para evitar um erro de compilação. public override int Area() { return side * side; } static void Main() { Square sq = new Square(12); Console.WriteLine("Área do quadrado= {0}", sq.Area()); } } exemplo de classe abstrata Declarando o método abstrato. A classe também é abstrata sobrescreendo o método abstrato
  9. abstract class ShapesClass { abstract public int Area(); } class

    Square : ShapesClass { int side = 0; public Square(int n) { side = n; } // Método Area é necessário para evitar um erro de compilação. public override int Area() { return side * side; } static void Main() { Square sq = new Square(12); Console.WriteLine("Área do quadrado= {0}", sq.Area()); } } exemplo de classe abstrata Declarando o método abstrato. A classe também é abstrata sobrescreendo o método abstrato Saída correta: Área do quadrado = 144
  10. Classe sealed Uma classe selada é uma classe que não

    pode ser herdada. O modificador sealed também pode ser utilizado com método ou propriedade que sobrescrevem um método virtual ou propriedade em uma classe base.
  11. class X { protected virtual void F() { Console.WriteLine("X.F"); }

    protected virtual void F2() { Console.WriteLine("X.F2"); } } class Y : X { sealed protected override void F() { Console.WriteLine("Y.F"); } protected override void F2() { Console.WriteLine("Y.F2"); } } class Z : Y { protected override void F() { Console.WriteLine("C.F"); } protected override void F2() { Console.WriteLine("Z.F2"); } } exemplo de classe selada No Visual C# a tentativa de substituir F provoca erro de compilação CS0239. A sobrescrita de F2 é permitida.
  12. Ampliação (upcasting) Ampliação converte um objeto de um tipo especializado

    em um tipo mais geral. Ou seja, é o movimento de objetos na sua linha de ancestrais no sentido da subclasse para a superclasse.
  13. public class Militar { public virtual void operacao() { Console.WriteLine("Iniciando

    operação militar..."); } } public class Exercito : Militar { public override void operacao() { Console.WriteLine("Marchando..."); } } public class Marinha : Militar { public override void operacao() { Console.WriteLine("Navegando..."); } } public class Aeronautica : Militar { public override void operacao() { Console.WriteLine("Voando..."); } } public class Infantaria : Exercito { public override void operacao() { base.operacao(); Console.WriteLine("Conquistando terreno..."); } } static void Main(string[] args) { Militar militar = new Militar(); Exercito exercito = new Exercito(); Marinha marinha = new Marinha(); Aeronautica aeronautica = new Aeronautica(); Infantaria infantaria = new Infantaria(); Militar[] lista = new Militar[] { militar, exercito, marinha, aeronautica, infantaria }; foreach (Militar m in lista) { m.operacao(); } }
  14. public class Militar { public virtual void operacao() { Console.WriteLine("Iniciando

    operação militar..."); } } public class Exercito : Militar { public override void operacao() { Console.WriteLine("Marchando..."); } } public class Marinha : Militar { public override void operacao() { Console.WriteLine("Navegando..."); } } public class Aeronautica : Militar { public override void operacao() { Console.WriteLine("Voando..."); } } public class Infantaria : Exercito { public override void operacao() { base.operacao(); Console.WriteLine("Conquistando terreno..."); } } static void Main(string[] args) { Militar militar = new Militar(); Exercito exercito = new Exercito(); Marinha marinha = new Marinha(); Aeronautica aeronautica = new Aeronautica(); Infantaria infantaria = new Infantaria(); Militar[] lista = new Militar[] { militar, exercito, marinha, aeronautica, infantaria }; foreach (Militar m in lista) { m.operacao(); } } Saída correta: Iniciando operação militar… Marchando... Navegando... Voando... Marchando... Conquistando terreno...
  15. public class Militar { public virtual void operacao() { Console.WriteLine("Iniciando

    operação militar..."); } } public class Exercito : Militar { public override void operacao() { Console.WriteLine("Marchando..."); } } public class Marinha : Militar { public override void operacao() { Console.WriteLine("Navegando..."); } } public class Aeronautica : Militar { public override void operacao() { Console.WriteLine("Voando..."); } } public class Infantaria : Exercito { public override void operacao() { base.operacao(); Console.WriteLine("Conquistando terreno..."); } } static void Main(string[] args) { Militar militar = new Militar(); Exercito exercito = new Exercito(); Marinha marinha = new Marinha(); Aeronautica aeronautica = new Aeronautica(); Infantaria infantaria = new Infantaria(); Militar[] lista = new Militar[] { militar, exercito, marinha, aeronautica, infantaria }; foreach (Militar m in lista) { m.operacao(); } } Saída correta: Iniciando operação militar… Marchando... Navegando... Voando... Marchando... Conquistando terreno... Altere este programa de forma que a classe Militar nunca possa ser instanciada.
  16. public abstract class Militar { public abstract void operacao(); }

    public class Exercito : Militar { public override void operacao() { Console.WriteLine("Marchando..."); } } public class Marinha : Militar { public override void operacao() { Console.WriteLine("Navegando..."); } } public class Aeronautica : Militar { public override void operacao() { Console.WriteLine("Voando..."); } } public class Infantaria : Exercito { public override void operacao() { base.operacao(); Console.WriteLine("Conquistando terreno..."); } } static void Main(string[] args) { //Militar militar = new Militar(); Exercito exercito = new Exercito(); Marinha marinha = new Marinha(); Aeronautica aeronautica = new Aeronautica(); Infantaria infantaria = new Infantaria(); //Militar[] lista = new Militar[] { militar, exercito, marinha, aeronautica, infantaria }; Militar[] lista = new Militar[] { exercito, marinha, aeronautica, infantaria }; foreach (Militar m in lista) { m.operacao(); } }
  17. public abstract class Militar { public abstract void operacao(); }

    public class Exercito : Militar { public override void operacao() { Console.WriteLine("Marchando..."); } } public class Marinha : Militar { public override void operacao() { Console.WriteLine("Navegando..."); } } public class Aeronautica : Militar { public override void operacao() { Console.WriteLine("Voando..."); } } public class Infantaria : Exercito { public override void operacao() { base.operacao(); Console.WriteLine("Conquistando terreno..."); } } static void Main(string[] args) { //Militar militar = new Militar(); Exercito exercito = new Exercito(); Marinha marinha = new Marinha(); Aeronautica aeronautica = new Aeronautica(); Infantaria infantaria = new Infantaria(); //Militar[] lista = new Militar[] { militar, exercito, marinha, aeronautica, infantaria }; Militar[] lista = new Militar[] { exercito, marinha, aeronautica, infantaria }; foreach (Militar m in lista) { m.operacao(); } }
  18. Modificador new Em C#, o modificador new esconde explicitamente um

    membro que é herdado de uma classe base. Ao ocultar um membro herdado, a versão derivada do membro substitui a versão da classe base.
  19. class BaseClass { public virtual void Method1() { Console.WriteLine("Base -

    Method1"); } public virtual void Method2() { Console.WriteLine("Base - Method2"); } } class DerivedClass : BaseClass { public override void Method1() { Console.WriteLine("Derived - Method1"); } public new void Method2() { Console.WriteLine("Derived - Method2"); } } class Program { static void Main(string[] args) { BaseClass bc = new BaseClass(); DerivedClass dc = new DerivedClass(); BaseClass bcdc = new DerivedClass(); bc.Method1(); bc.Method2(); dc.Method1(); dc.Method2(); bcdc.Method1(); bcdc.Method2(); } }
  20. class BaseClass { public virtual void Method1() { Console.WriteLine("Base -

    Method1"); } public virtual void Method2() { Console.WriteLine("Base - Method2"); } } class DerivedClass : BaseClass { public override void Method1() { Console.WriteLine("Derived - Method1"); } public new void Method2() { Console.WriteLine("Derived - Method2"); } } class Program { static void Main(string[] args) { BaseClass bc = new BaseClass(); DerivedClass dc = new DerivedClass(); BaseClass bcdc = new DerivedClass(); bc.Method1(); bc.Method2(); dc.Method1(); dc.Method2(); bcdc.Method1(); bcdc.Method2(); } } Estas duas chamadas chamam os métodos definidos em BaseClass
  21. class BaseClass { public virtual void Method1() { Console.WriteLine("Base -

    Method1"); } public virtual void Method2() { Console.WriteLine("Base - Method2"); } } class DerivedClass : BaseClass { public override void Method1() { Console.WriteLine("Derived - Method1"); } public new void Method2() { Console.WriteLine("Derived - Method2"); } } class Program { static void Main(string[] args) { BaseClass bc = new BaseClass(); DerivedClass dc = new DerivedClass(); BaseClass bcdc = new DerivedClass(); bc.Method1(); bc.Method2(); dc.Method1(); dc.Method2(); bcdc.Method1(); bcdc.Method2(); } } Estas duas chamadas chamam os métodos definidos em BaseClass Saída correta: Base - Method1 Base - Method2
  22. class BaseClass { public virtual void Method1() { Console.WriteLine("Base -

    Method1"); } public virtual void Method2() { Console.WriteLine("Base - Method2"); } } class DerivedClass : BaseClass { public override void Method1() { Console.WriteLine("Derived - Method1"); } public new void Method2() { Console.WriteLine("Derived - Method2"); } } class Program { static void Main(string[] args) { BaseClass bc = new BaseClass(); DerivedClass dc = new DerivedClass(); BaseClass bcdc = new DerivedClass(); bc.Method1(); bc.Method2(); dc.Method1(); dc.Method2(); bcdc.Method1(); bcdc.Method2(); } } Estas duas chamadas chamam os métodos definidos em BaseClass Estas duas chamadas chamam os métodos definidos em DerivedClass Saída correta: Base - Method1 Base - Method2
  23. class BaseClass { public virtual void Method1() { Console.WriteLine("Base -

    Method1"); } public virtual void Method2() { Console.WriteLine("Base - Method2"); } } class DerivedClass : BaseClass { public override void Method1() { Console.WriteLine("Derived - Method1"); } public new void Method2() { Console.WriteLine("Derived - Method2"); } } class Program { static void Main(string[] args) { BaseClass bc = new BaseClass(); DerivedClass dc = new DerivedClass(); BaseClass bcdc = new DerivedClass(); bc.Method1(); bc.Method2(); dc.Method1(); dc.Method2(); bcdc.Method1(); bcdc.Method2(); } } Estas duas chamadas chamam os métodos definidos em BaseClass Estas duas chamadas chamam os métodos definidos em DerivedClass Saída correta: Base - Method1 Base - Method2 Derived - Method1 Derived - Method2
  24. class BaseClass { public virtual void Method1() { Console.WriteLine("Base -

    Method1"); } public virtual void Method2() { Console.WriteLine("Base - Method2"); } } class DerivedClass : BaseClass { public override void Method1() { Console.WriteLine("Derived - Method1"); } public new void Method2() { Console.WriteLine("Derived - Method2"); } } class Program { static void Main(string[] args) { BaseClass bc = new BaseClass(); DerivedClass dc = new DerivedClass(); BaseClass bcdc = new DerivedClass(); bc.Method1(); bc.Method2(); dc.Method1(); dc.Method2(); bcdc.Method1(); bcdc.Method2(); } } Estas duas chamadas chamam os métodos definidos em BaseClass Estas duas chamadas chamam os métodos definidos em DerivedClass As duas chamadas seguintes produzem resultados diferentes, dependendo se override (Method1) ou new (Method2) for utilizado. Saída correta: Base - Method1 Base - Method2 Derived - Method1 Derived - Method2
  25. class BaseClass { public virtual void Method1() { Console.WriteLine("Base -

    Method1"); } public virtual void Method2() { Console.WriteLine("Base - Method2"); } } class DerivedClass : BaseClass { public override void Method1() { Console.WriteLine("Derived - Method1"); } public new void Method2() { Console.WriteLine("Derived - Method2"); } } class Program { static void Main(string[] args) { BaseClass bc = new BaseClass(); DerivedClass dc = new DerivedClass(); BaseClass bcdc = new DerivedClass(); bc.Method1(); bc.Method2(); dc.Method1(); dc.Method2(); bcdc.Method1(); bcdc.Method2(); } } Estas duas chamadas chamam os métodos definidos em BaseClass Estas duas chamadas chamam os métodos definidos em DerivedClass As duas chamadas seguintes produzem resultados diferentes, dependendo se override (Method1) ou new (Method2) for utilizado. Saída correta: Base - Method1 Base - Method2 Derived - Method1 Derived - Method2 Derived - Method1 Base - Method2
  26. 7) Crie um diagrama de classes para representar 4 espécies

    de animais. • Pássaros ◦ Bem-te-vi ◦ Papagaio • Mamífero ◦ Cachorro ◦ Vaca 8) Implemente estas classes usando as técnicas apresentadas nas últimas aulas. Note que existem alguns comportamentos que são comuns entre os animais. Por exemplo: • Locomover ou voar; • Nascer; • Morrer; • Comer; • etc. exercício
  27. 7) Crie um diagrama de classes para representar 4 espécies

    de animais. • Pássaros ◦ Bem-te-vi ◦ Papagaio • Mamífero ◦ Cachorro ◦ Vaca solução
  28. public abstract class Animal { public virtual void nascer(){ Console.Write("Nescendo");

    } public virtual void morrer(){ Console.Write("Morrendo"); } public virtual void crescer(){ Console.Write("crescendo"); } public virtual void comer(){ Console.Write("comendo"); } } public abstract class Passaro : Animal { public override void nascer() { base.nascer(); Console.Write(" um passaro"); } public override void morrer() { base.morrer(); Console.Write(" um passaro"); } } public class BemTeVi : Passaro { public override void nascer() { base.nascer(); Console.Write(" bem-te-vi"); Console.WriteLine(""); } public override void morrer() { base.morrer(); Console.Write(" bem-te-vi"); Console.WriteLine(""); } public override void crescer() { Console.Write("O bem-te-vi esta "); base.crescer(); Console.WriteLine(""); } public override void comer() { Console.Write("O bem-te-vi esta "); base.comer(); Console.WriteLine(""); } } class Program { static void Main(string[] args) { BemTeVi btv = new BemTeVi(); btv.nascer(); btv.comer(); btv.crescer(); btv.morrer(); Console.ReadKey(); } } solução Saída: Nescendo um passaro bem-te-vi O bem-te-vi esta comendo O bem-te-vi esta crescendo Morrendo um passaro bem-te-vi
  29. class Estado { public Estado(String s) { System.out.println(s); } }

    class Pessoa { Estado p = new Estado("Ativo"); public Pessoa() { System.out.println("Pessoa"); } } class Idoso extends Pessoa { Estado i = new Estado("Sabio"); public Idoso() { System.out.println("Idoso"); } } class Avo extends Idoso { Estado a1 = new Estado("Alegre"); public Avo() { System.out.println("Avo"); Estado a3 = new Estado("Orgulhoso"); } Estado a2 = new Estado("Amigo"); public void fim() { System.out.println("Fim"); } Estado a3 = new Estado("Satisfeito"); } public class Main { public static void main( String[] args ) { Avo a = new Avo(); a.fim(); } } código Java
  30. class Estado { public Estado(String s) { System.out.println(s); } }

    class Pessoa { Estado p = new Estado("Ativo"); public Pessoa() { System.out.println("Pessoa"); } } class Idoso extends Pessoa { Estado i = new Estado("Sabio"); public Idoso() { System.out.println("Idoso"); } } class Avo extends Idoso { Estado a1 = new Estado("Alegre"); public Avo() { System.out.println("Avo"); Estado a3 = new Estado("Orgulhoso"); } Estado a2 = new Estado("Amigo"); public void fim() { System.out.println("Fim"); } Estado a3 = new Estado("Satisfeito"); } public class Main { public static void main( String[] args ) { Avo a = new Avo(); a.fim(); } } Saída correta em Java: Ativo Pessoa Sabio Idoso Alegre Amigo Satisfeito Avo Orgulhoso Fim código Java
  31. class Estado { public Estado(String s) { Console.WriteLine(s); } }

    class Pessoa { Estado p = new Estado("Ativo"); public Pessoa() { Console.WriteLine("Pessoa"); } } class Idoso : Pessoa { Estado i = new Estado("Sabio"); public Idoso() { Console.WriteLine("Idoso"); } } class Avo : Idoso { Estado a1 = new Estado("Alegre"); public Avo() { Console.WriteLine("Avo"); Estado a3 = new Estado("Orgulhoso"); } Estado a2 = new Estado("Amigo"); public void fim() { Console.WriteLine("Fim"); } Estado a3 = new Estado("Satisfeito"); } static void Main(string[] args) { Avo a = new Avo(); a.fim(); Console.ReadLine(); } código Visual C#
  32. class Estado { public Estado(String s) { Console.WriteLine(s); } }

    class Pessoa { Estado p = new Estado("Ativo"); public Pessoa() { Console.WriteLine("Pessoa"); } } class Idoso : Pessoa { Estado i = new Estado("Sabio"); public Idoso() { Console.WriteLine("Idoso"); } } class Avo : Idoso { Estado a1 = new Estado("Alegre"); public Avo() { Console.WriteLine("Avo"); Estado a3 = new Estado("Orgulhoso"); } Estado a2 = new Estado("Amigo"); public void fim() { Console.WriteLine("Fim"); } Estado a3 = new Estado("Satisfeito"); } static void Main(string[] args) { Avo a = new Avo(); a.fim(); Console.ReadLine(); } código Visual C# Saída correta no Visual C#: Alegre Amigo Satisfeito Sabio Ativo Pessoa Idoso Avo Orgulhoso Fim
  33. public class Parent { string parentString; public Parent() { Console.WriteLine("Construtor

    classe base"); } public Parent(string myString) { parentString = myString; Console.WriteLine(parentString); } public void print() { Console.WriteLine("Eu sou uma classe pai (classe base)"); } } public class Child : Parent { public Child() : base("Chamando da classe herdada") { Console.WriteLine("Construtor da subclasse"); } public new void print() { base.print(); Console.WriteLine("Eu sou uma classe filha (subclasse)"); } } public class Program { public static void Main() { Child child = new Child(); child.print(); ((Parent)child).print(); } } código Visual C#
  34. public class Parent { string parentString; public Parent() { Console.WriteLine("Construtor

    classe base"); } public Parent(string myString) { parentString = myString; Console.WriteLine(parentString); } public void print() { Console.WriteLine("Eu sou uma classe pai (classe base)"); } } public class Child : Parent { public Child() : base("Chamando da classe herdada") { Console.WriteLine("Construtor da subclasse"); } public new void print() { base.print(); Console.WriteLine("Eu sou uma classe filha (subclasse)"); } } public class Program { public static void Main() { Child child = new Child(); child.print(); ((Parent)child).print(); } } código Visual C# Saída correta: Chamando da classe herdada Construtor da subclasse Eu sou uma classe pai (classe base) Eu sou uma classe filha (subclasse) Eu sou uma classe pai (classe base)
  35. public class Parent { string parentString; public Parent() { Console.WriteLine("Construtor

    classe base"); } public Parent(string myString) { parentString = myString; Console.WriteLine(parentString); } public void print() { Console.WriteLine("Eu sou uma classe pai (classe base)"); } } public class Child : Parent { public Child() //: base("Chamando da classe herdada") { Console.WriteLine("Construtor da subclasse"); } public new void print() { base.print(); Console.WriteLine("Eu sou uma classe filha (subclasse)"); } } public class Program { public static void Main() { Child child = new Child(); child.print(); ((Parent)child).print(); } } código Visual C# A única diferença deste exemplo para o exemplo anterior é que esta linha foi comentada
  36. public class Parent { string parentString; public Parent() { Console.WriteLine("Construtor

    classe base"); } public Parent(string myString) { parentString = myString; Console.WriteLine(parentString); } public void print() { Console.WriteLine("Eu sou uma classe pai (classe base)"); } } public class Child : Parent { public Child() //: base("Chamando da classe herdada") { Console.WriteLine("Construtor da subclasse"); } public new void print() { base.print(); Console.WriteLine("Eu sou uma classe filha (subclasse)"); } } public class Program { public static void Main() { Child child = new Child(); child.print(); ((Parent)child).print(); } } código Visual C# Saída correta: Construtor classe base Construtor da subclasse Eu sou uma classe pai (classe base) Eu sou uma classe filha (subclasse) Eu sou uma classe pai (classe base) A única diferença deste exemplo para o exemplo anterior é que esta linha foi comentada
  37. public class Parent { string parentString; //public Parent() //{ //

    Console.WriteLine("Construtor classe base"); //} public Parent(string myString) { parentString = myString; Console.WriteLine(parentString); } public void print() { Console.WriteLine("Eu sou uma classe pai (classe base)"); } } public class Child : Parent { public Child() //: base("Chamando da classe herdada") { Console.WriteLine("Construtor da subclasse"); } public new void print() { base.print(); Console.WriteLine("Eu sou uma classe filha (subclasse)"); } } public class Program { public static void Main() { Child child = new Child(); child.print(); ((Parent)child).print(); } } código Visual C# O construtor default foi removido. O que acontece?
  38. public class Parent { string parentString; //public Parent() //{ //

    Console.WriteLine("Construtor classe base"); //} public Parent(string myString) { parentString = myString; Console.WriteLine(parentString); } public void print() { Console.WriteLine("Eu sou uma classe pai (classe base)"); } } public class Child : Parent { public Child() //: base("Chamando da classe herdada") { Console.WriteLine("Construtor da subclasse"); } public new void print() { base.print(); Console.WriteLine("Eu sou uma classe filha (subclasse)"); } } public class Program { public static void Main() { Child child = new Child(); child.print(); ((Parent)child).print(); } } código Visual C# Ao tentar compilar este código o seguinte erro é gerado 'Parent' does not contain a constructor that takes 0 arguments O construtor default foi removido. O que acontece?
  39. public class Parent { string parentString; //public Parent() //{ //

    Console.WriteLine("Construtor classe base"); //} //public Parent(string myString) //{ // parentString = myString; // Console.WriteLine(parentString); //} public void print() { Console.WriteLine("Eu sou uma classe pai (classe base)"); } } public class Child : Parent { public Child() //: base("Chamando da classe herdada") { Console.WriteLine("Construtor da subclasse"); } public new void print() { base.print(); Console.WriteLine("Eu sou uma classe filha (subclasse)"); } } public class Program { public static void Main() { Child child = new Child(); child.print(); ((Parent)child).print(); } } código Visual C# Todos os construtores foram removidos. O que acontece agora?
  40. public class Parent { string parentString; //public Parent() //{ //

    Console.WriteLine("Construtor classe base"); //} //public Parent(string myString) //{ // parentString = myString; // Console.WriteLine(parentString); //} public void print() { Console.WriteLine("Eu sou uma classe pai (classe base)"); } } public class Child : Parent { public Child() //: base("Chamando da classe herdada") { Console.WriteLine("Construtor da subclasse"); } public new void print() { base.print(); Console.WriteLine("Eu sou uma classe filha (subclasse)"); } } public class Program { public static void Main() { Child child = new Child(); child.print(); ((Parent)child).print(); } } código Visual C# Todos os construtores foram removidos. O que acontece agora? O código executa sem problemas !!!
  41. public class Parent { string parentString; //public Parent() //{ //

    Console.WriteLine("Construtor classe base"); //} //public Parent(string myString) //{ // parentString = myString; // Console.WriteLine(parentString); //} public void print() { Console.WriteLine("Eu sou uma classe pai (classe base)"); } } public class Child : Parent { public Child() //: base("Chamando da classe herdada") { Console.WriteLine("Construtor da subclasse"); } public new void print() { base.print(); Console.WriteLine("Eu sou uma classe filha (subclasse)"); } } public class Program { public static void Main() { Child child = new Child(); child.print(); ((Parent)child).print(); } } código Visual C# Todos os construtores foram removidos. O que acontece agora? Saída correta: Construtor da subclasse Eu sou uma classe pai (classe base) Eu sou uma classe filha (subclasse) Eu sou uma classe pai (classe base)
  42. public class Parent { string parentString; //public Parent() //{ //

    Console.WriteLine("Construtor classe base"); //} //public Parent(string myString) //{ // parentString = myString; // Console.WriteLine(parentString); //} public void print() { Console.WriteLine("Eu sou uma classe pai (classe base)"); } } public class Child : Parent { public Child() //: base("Chamando da classe herdada") { Console.WriteLine("Construtor da subclasse"); } public new void print() { base.print(); Console.WriteLine("Eu sou uma classe filha (subclasse)"); } } public class Program { public static void Main() { Child child = new Child(); child.print(); ((Parent)child).print(); } } código Visual C# Todos os construtores foram removidos. O que acontece agora? Saída correta: Construtor da subclasse Eu sou uma classe pai (classe base) Eu sou uma classe filha (subclasse) Eu sou uma classe pai (classe base) Por quê?
  43. Em C# se você não fornecer um construtor default o

    compilador automaticamente gera ele pra você. Exemplo: Construtor default public class Foo { } O compilador irá gerar isso: public class Foo { public Foo() { } } No entanto, assim que você fornecer um outro construtor o compilador não irá mais automaticamente gerar um construtor default. public class Foo { public Foo(int x, int y) { // ... } }
  44. Interface Uma interface é uma descrição de todas as funções

    que um objeto deve ter para ser do tipo da interface. Ela impõe certas propriedades e comportamentos aos objetos.
  45. interface IPoint { int x { get; set; } int

    y { get; set; } } class Point : IPoint { private int _x; private int _y; public Point(int x, int y) { _x = x; _y = y; } public int x { get{ return _x; } set{ _x = value; } } public int y { get{ return _y; } set{ _y = value; } } } class MainClass { static void PrintPoint(IPoint p) { Console.WriteLine("x={0}, y={1}", p.x, p.y); } static void Main() { Point p = new Point(2, 3); Console.Write("My Point: "); PrintPoint(p); } } Saída correta: My Point: x=2, y=3
  46. exemplo de interface Interface IComparable "Define um método de comparação

    genérico que um valor ou classe implementa para ordenar ou classificar suas instâncias." a Interface IComparable possui o método int CompareTo( Object obj )_ que compara a instância atual com outro objeto do mesmo tipo e retorna um valor inteiro que indica se a instância atual precede, segue ou ocorre na mesma posição na ordem de classificação como o outro objeto. Valor Descrição Menor que zero A instância atual precede o objeto obj na ordenação Igual a zero A instância atual ocorre na mesma posição do objeto obj na ordenação Maior que zero A instância atual sucede o objeto obj na ordenação
  47. using System; using System.Collections; public class Temperatura : IComparable {

    protected double _temperatura; public Temperatura( double Celsius ) { this._temperatura = Celsius; } public int CompareTo(object obj) { Temperatura outraTemperatura = obj as Temperatura; if (this._temperatura < outraTemperatura.Celsius) return -1; else if (this._temperatura == outraTemperatura.Celsius) return 0; else return 1; } public double Celsius { get { return this._temperatura; } set { this._temperatura = value; } } } public class CompareTemperatures { public static void Main() { ArrayList temperatures = new ArrayList(); temperatures.Add(new Temperatura(35)); temperatures.Add(new Temperatura(40)); temperatures.Add(new Temperatura(22)); temperatures.Add(new Temperatura(20)); temperatures.Add(new Temperatura(29)); Console.WriteLine("ArrayList temperatures antes da ordenacao"); foreach (Temperatura temp in temperatures) Console.WriteLine(temp.Celsius); // Sort ArrayList. temperatures.Sort(); Console.WriteLine("ArrayList temperatures depois da ordenacao"); foreach (Temperatura temp in temperatures) Console.WriteLine(temp.Celsius); Console.ReadLine(); } } Saída correta: ArrayList temperatures antes da ordenacao 35 40 22 20 29 ArrayList temperatures depois da ordenacao 20 22 29 35 40
  48. 9) Utilizando o exemplo de interface apresentado, implemente uma classe

    Empregado que possui simplesmente nome e salário de modo que os empregados possam ser ordenados por ordem de salário. exercício