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.
— 1º Semestre 2015 Prof. Eduardo Miranda [email protected] Método Virtual, Classe Abstrata, Interface, Classe e Métodos Sealed, Ampliação e modificador New
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(); } }
} 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
} 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
} 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
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
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
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.
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.
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(); } }
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...
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.
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(); } }
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(); } }
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
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
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
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
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
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
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
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
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
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#
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
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#
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)
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
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
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?
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?
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?
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 !!!
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)
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ê?
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) { // ... } }
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