none
Interface, Abstract class e Sealed Class

    Pergunta

  • Bom dia a todos,

     O conceito de quando utilizar cada tipo de classe(Interface, Abstract class e Sealed Class ) pode parecer um pouco confuso as vezes!
    Alguém pode me dar umas dicas e quando usar cada tipo de classe?

    Obrigado!


    David Ramires
    quinta-feira, 11 de novembro de 2010 10:41

Respostas

Todas as Respostas

  • David,

    Confira esta série de três artigos com uma introdução muito boa a orientação a objetos, espero que responda as suas dúvidas:

    http://www.linhadecodigo.com.br/Artigo.aspx?id=307

    http://www.linhadecodigo.com.br/Artigo.aspx?id=315

    http://www.linhadecodigo.com.br/Artigo.aspx?id=316

    at.,


    Rogério de Resende Ohashi | Ohashi.NET (.NET, Security, C#, WinForms, WCF, Workflow, Azure, Windows Phone, Mono)
    quinta-feira, 11 de novembro de 2010 11:09
  •  

    Interface:

    Interface não é bem uma classe.

     

    É mais um contrato de obrigatoriedade de implementação.

    Ela contém apenas as assinaturas de métodos, atributos e eventos.

    Quando uma classe herda uma interface, dizemos que ela IMPLEMENTA a interface. Com isso ela DEVE implementar todos os métodos e conter todos os atributos daquela classe.

    Serve, entre outras tantas funcionalidades, para padronização de código. (serve também para compatibilidade de classes)

     

    Abstract:

    Uma classe abstrata não pode ser instanciada, somente pode ser herdada. A única finalidade de uma classe abstrata seria ser herdada por outras classes.

     

    Sealed:

    Uma classe sealed não pode ser herdada. É o fim da cadeia. Exatamente o contrário da abstrata.

     

    Abaixo um cenário completo:

     


    
    interface IVeiculo
      {
        int id { get; set; }
        string fabricante { get; set; }
    
        void acelerar(decimal velocidade);
      }
    
    //
    
    abstract class Carro : IVeiculo
      {
        #region Membros de IVeiculo
    
        public int id { get; set; }
        public string fabricante { get; set; }
    
        public void acelerar(decimal velocidade)
        {
          
        }
    
        #endregion
    
        public abstract void abrirPortaMala();
      }
    
    class Sedan : Carro, IVeiculo
      {
        #region Membros de IVeiculo
    
        public int id { get; set; }
        public string fabricante { get; set; }
    
        public void acelerar(decimal velocidade)
        {
    
        }
    
        #endregion
    
        public override void abrirPortaMala()
        {
    
        }
      }
    
    
    //
    
    abstract class Moto: IVeiculo
      {
        #region Membros de IVeiculo
    
        public int id { get; set; }
        public string fabricante { get; set; }
    
        public void acelerar(decimal velocidade)
        {
    
        }
    
        #endregion
    
        public abstract void empinar();
      }
    
    class Scooter: Moto, IVeiculo
      {
        #region Membros de IVeiculo
    
        public int id { get; set; }
        public string fabricante { get; set; }
    
        public void acelerar(decimal velocidade)
        {
    
        }
    
        #endregion
    
        public override void empinar()
        {
          //
        }
      }
    

    quinta-feira, 11 de novembro de 2010 11:36
  • Estou olhando todas as dicas e logo posto alguma coisa sobre o assunto!

    Obrigado a TODOS pelas dicas     :D

     

     

     


    David Ramires
    quinta-feira, 11 de novembro de 2010 16:56
  • bom, eu fiz aqui um exemplo bem simples:

    Imaginem um maquinista de trem, em sua cabine tem um painel de controle a sua frente, onde em toda estação
    que ele para, ele aciona as informações da estação atual, como qual porta o usuário deve
    desembarcar, o nome da estação e se ela é estação terminal!

    bom base nessas informações eu montei o codigo abaixo:

     

    public abstract class Estacao 
     {
     public string nome { get; set; } 
     public string desembarque { get; set; }
     public Boolean estacaoTerminal { get; set; }
     abstract public void EmitirInformacao(); 
     
     }
    
    
     public class Suzano : Estacao
     {
     public override void EmitirInformacao()
     {
      this.nome = "Suzano";
      this.desembarque = "Esquerdo do Trem";
      this.estacaoTerminal = false;  
     }
     }
    
     public class Poa : Estacao
     {
     public override void EmitirInformacao()
     {
      this.nome = "Póa";
      this.desembarque = "Direito do Trem";
      this.estacaoTerminal = false;
     }
     }
    
     public class Guaianazes : Estacao
     {
     public override void EmitirInformacao()
     {
      this.nome = "Guaianazes";
      this.desembarque = "Esquerdo do Trem";
      this.estacaoTerminal = true;
     }
     }
     
    }

    para usar: (no meu caso eu fiz um exemplo CONSOLE)

     

    Estacao estacao = null;
    
      Console.WriteLine("[S]uzano, [P]óa, [G]uaianazes"); 
      Console.Write("Qual a Estação Atual?");
      char opcao = Console.ReadLine().ToUpper()[0];
    
      switch (opcao)
      {
      case 'S':
       estacao = new Suzano();
       break;
      case 'P':
       estacao = new Poa();
       break;
      case 'G':
       estacao = new Guaianazes();
       break;  
      default:
       return;
      }
      
      
      estacao.EmitirInformacao(); 
      
      Console.WriteLine();
      Console.WriteLine("Estação: {0}", estacao.nome);
      Console.WriteLine("\tDesembarque pelo lado: {0}", estacao.desembarque);  
    
      if (estacao.estacaoTerminal)
      {
      Console.WriteLine("\tEste trem não presta mais serviço, por favor desembarcar!"); 
      }
    
      Console.ReadKey();

     

    Gostaria de saber o que podemos alterar para melhorar esse código, como implementar esses conceitos OO nesse caso! Será que eu poderia ter feito com interface? Na minha opinião não vi a necessidade, até o momento.

    uma coisa que tentei fazer e não deu muito certo foi:

     

    na classe : Estação 

    queria deixar as propriedades como  

     Protected

    pq atualmente está como Public, e na hora de fazer a instancia eu posso jogar outro valor, por exemplo em  

     ...
    estacao.EmitirInformacao();
    estacao.nome = "david";  
    Console.WriteLine();
     ...

     

    fico no aguardo dos comentários! obrigado

     


    David Ramires

     

     

    • Editado David Ramires terça-feira, 16 de novembro de 2010 17:02
    quinta-feira, 11 de novembro de 2010 17:54
  • eu Tb tenho várias dúvidas sobre Interface ou Classe Abstrata, gostei do seu exemplo que envolve polimorfismo!

    vc disse que queria deixar como Protected as propriedades, não poderia ser private?

    Obrigada!

    sexta-feira, 12 de novembro de 2010 18:44
  • Oi,

    então como private eu não posso usar as propriedades nas classes que herdam a classe Estacao!

    Depois eu vou procurar, na maquina de casa alguns links sobre o tema do meu topico e posto aqui para vc!

    qualquer coisa posta ae, vamos esperar alguem mais experiente comentar o meu exemplo!

     


    David Ramires
    • Editado David Ramires terça-feira, 16 de novembro de 2010 11:20 alterar texto
    terça-feira, 16 de novembro de 2010 11:18
  • Sobre a questão de deixar as propriedades da classe estação como protected, não achei como poderia fazer mas..... achei um forma:

     

    public abstract class Estacao 
      {
        public string nome { get; protected set; }
        public string desembarque { get; protected set; }
        public Boolean estacaoTerminal { get; protected set; }
        abstract public void EmitirInformacao();  
        
      }
    

    no Set da propriedade eu deixo como PROTECTED, então só as classes que herdam da ESTACAO vão poder adcionar um valor!

    Exemplo:

     public class Suzano : Estacao
      {
        public override void EmitirInformacao()
        {
          this.nome = "Suzano";
          this.desembarque = "Esquerdo do Trem";
          this.estacaoTerminal = false;     
        }
      }
    

    então se agora eu tentar fazer isso aqui: 

    estacao.EmitirInformacao();
    estacao.nome = "qualquercoisa"; // da erro ele não deixa! será possivel apenas na classe não na instancia!
    

    David Ramires
    terça-feira, 16 de novembro de 2010 16:58
  • entendi! bacana seu exemplo!

    olhei os links que os meninos colocaram achei bem interessante, preciso praticar mais!

    Obrigada.

     

    quarta-feira, 17 de novembro de 2010 18:17
  • Obrigado! pena que ninguem mais quer participar!
    David Ramires
    segunda-feira, 22 de novembro de 2010 12:26