Olá,
Nada melhor do que "fazer sala" para os bons amigos. Hoje estou feliz em receber Rudson Kiyoshi Souza Carvalho para nos ajudar a construir o aprender. Ele é programador, estudante de TI e dentre tantos assuntos que tem aprendido em campo e nos cursos que tem feito, ele escolheu nos falar sobre C#.
Seu próximo desafio é ministrar voluntariamente um curso de SQL Server no campus ABC da UNIBAN para os interessados em aprender a trabalhar com banco de dados.
Suas atitudes dispensam meu testemunho, mas é bom que fique registrado aqui ... o Rudson é um profissional comprometido, um estudante com ótimo rendimento, um amigo fiel e imprescindível.
Agradecemos a boa vontade e desejamos sucesso!!!
Beijos,
Van
Trabalhando com classes abstratas, classes seladas e interfaces em C#
Por Rudson Kiyoshi Souza Carvalho
Resumo
Este artigo descreve o que são Classes Abstratas, Seladas e Interfaces, e também explica quando devemos implementar cada uma delas em nosso código.
Introdução
Utilizar classes seladas é um novo conceito adicionado ao C#. O conceito de quando utilizar cada tipo de classe pode parecer um pouco confuso no início, mas após ter entendido bem os conceitos de cada uma e entender suas similaridades, poderemos partir para um desenvolvimento mais seguro e escalável, tentarei neste artigo descrever não só cada tipo de classe, mas também descrever algumas situações que devemos usar este tipo de codificação. Os exemplos de códigos abaixo utilizam a linguagem C#.
O que é uma classe abstrata? (Abstract Class)
A classe abstrata é um tipo de classe que somente pode ser herdada e não instanciada, de certa forma pode se dizer que este tipo de classe é uma classe conceitual que pode definir funcionalidades para que as suas subclasses (classes que herdam desta classe) possam implementá-las de forma não obrigatória, ou seja ao se definir um conjunto de métodos na classe abstrata não é de total obrigatoriedade a implementação de todos os métodos em suas subclasses, em uma classe abstrata os métodos declarados podem ser abstratos ou não, e suas implementações devem ser obrigatórias na subclasse ou não, quando criamos um método abstrato em uma classe abstrata sua implementação é obrigatória, caso você não implemente o mesmo o compilador criará um erro em tempo de compilação.
Este artigo descreve o que são Classes Abstratas, Seladas e Interfaces, e também explica quando devemos implementar cada uma delas em nosso código.
Introdução
Utilizar classes seladas é um novo conceito adicionado ao C#. O conceito de quando utilizar cada tipo de classe pode parecer um pouco confuso no início, mas após ter entendido bem os conceitos de cada uma e entender suas similaridades, poderemos partir para um desenvolvimento mais seguro e escalável, tentarei neste artigo descrever não só cada tipo de classe, mas também descrever algumas situações que devemos usar este tipo de codificação. Os exemplos de códigos abaixo utilizam a linguagem C#.
O que é uma classe abstrata? (Abstract Class)
A classe abstrata é um tipo de classe que somente pode ser herdada e não instanciada, de certa forma pode se dizer que este tipo de classe é uma classe conceitual que pode definir funcionalidades para que as suas subclasses (classes que herdam desta classe) possam implementá-las de forma não obrigatória, ou seja ao se definir um conjunto de métodos na classe abstrata não é de total obrigatoriedade a implementação de todos os métodos em suas subclasses, em uma classe abstrata os métodos declarados podem ser abstratos ou não, e suas implementações devem ser obrigatórias na subclasse ou não, quando criamos um método abstrato em uma classe abstrata sua implementação é obrigatória, caso você não implemente o mesmo o compilador criará um erro em tempo de compilação.
Exemplo de implementação retirado do books online em C#.
abstract class formaClasse
{
abstract public int Area();
}
class quadrado : formaClasse
{
int x, y;
// Se não for implementado o método Area()
// será gerado um compile-time error.
public override int Area()
{
return x * y;
}
}
O que é uma Interface? (Interface)
As interfaces são fundamentais em um sistema orientado a objetos, quando dizemos que um objeto é a instância de uma classe, na verdade queremos dizer, que este objeto implementa a interface definida pela classe, ou seja uma interface define as operações que um objeto será obrigado a implementar. Para cada operação declarada por um objeto deve ser especificado o nome da operação, os objetos que esta operação aceita como parâmetro e o tipo de valor retornado pela operação; este conjunto de informações sobre uma determinada operação tem o nome de assinatura da operação, e um conjunto de assinaturas de operações dá-se o nome de interface.
É importante lembrar que uma interface nunca contém implementação, ou seja numa interface não se pode definir campos, pois o mesmo é uma implementação de um atributo objeto, a interface também não permite construtores pois num contrutor temos as instruções usadas para inicializar campos. Para podermos usar uma interface devemos criar uma classe ou estrutura e herdar da interface, com isso é obrigatório implementar todos os métodos da interface.
Exemplo de implementação retirado do books online em C#.
interface IExemploInterface
{
void ExemploMetodo();
}
class Implementacaoclasse : IExemploInterface
{
// Implementação explicita da interface
void IExemploInterface.ExemploMetodo()
{
// Implementação do método
}
static void Main()
{
// Declarando uma instancia de uma interface
IExemploInterface obj = new Implementacaoclasse();
// chame o método.
obj.SampleMethod();
}
}
Classes Abstratas X Interfaces
Uma classe abstrata pode conter métodos completos ou incompletos. Uma Interface pode conter apenas a assinatura de um método, mas nenhum corpo ou implementação. Portanto, em uma classe abstrata pode-se implementar métodos, mas em uma Interface não. Uma classe abstrata pode conter campos, construtores, ou destrutores e aplicar propriedades. Uma interface não pode conter campos, construtores, ou destrutores pode possuir apenas a propriedade da assinatura, mas não a implementação. Uma classe abstrata não suporta múltiplas heranças, mas uma interface pode suportar múltiplas herança. Assim, uma classe pode herdar várias interfaces, mas apenas uma classe abstrata. Uma classe que implementa uma interface tem de obrigatoriamente implementar todos os métodos da interface, mas o mesmo não é exigido no caso de uma classe abstrata. As classes abstratas são mais rápidas que as interfaces.
O que é uma classe selada? (Sealed Class)
Uma classe selada é utilizada para restringir características da herança do objeto, quando uma classe é definida como sealed, está classe não poderá ser herdada, caso você tente o compilador criara um erro em tempo de compilação, após criar uma classe selada pode se observar que o intelisense não mostra o nome da classe definida como sealed quando você tenta criar uma herança para novas classes.
Exemplo de implementação retirado do books online em C#.
sealed class ClasseSelada
{
public int x;
public int y;
}
class MainClass
{
static void Main()
{
ClasseSelada sc = new ClasseSelada();
sc.x = 110;
sc.y = 150;
Console.WriteLine("x = {0}, y = {1}", sc.x, sc.y);
}
}
abstract class formaClasse
{
abstract public int Area();
}
class quadrado : formaClasse
{
int x, y;
// Se não for implementado o método Area()
// será gerado um compile-time error.
public override int Area()
{
return x * y;
}
}
O que é uma Interface? (Interface)
As interfaces são fundamentais em um sistema orientado a objetos, quando dizemos que um objeto é a instância de uma classe, na verdade queremos dizer, que este objeto implementa a interface definida pela classe, ou seja uma interface define as operações que um objeto será obrigado a implementar. Para cada operação declarada por um objeto deve ser especificado o nome da operação, os objetos que esta operação aceita como parâmetro e o tipo de valor retornado pela operação; este conjunto de informações sobre uma determinada operação tem o nome de assinatura da operação, e um conjunto de assinaturas de operações dá-se o nome de interface.
É importante lembrar que uma interface nunca contém implementação, ou seja numa interface não se pode definir campos, pois o mesmo é uma implementação de um atributo objeto, a interface também não permite construtores pois num contrutor temos as instruções usadas para inicializar campos. Para podermos usar uma interface devemos criar uma classe ou estrutura e herdar da interface, com isso é obrigatório implementar todos os métodos da interface.
Exemplo de implementação retirado do books online em C#.
interface IExemploInterface
{
void ExemploMetodo();
}
class Implementacaoclasse : IExemploInterface
{
// Implementação explicita da interface
void IExemploInterface.ExemploMetodo()
{
// Implementação do método
}
static void Main()
{
// Declarando uma instancia de uma interface
IExemploInterface obj = new Implementacaoclasse();
// chame o método.
obj.SampleMethod();
}
}
Classes Abstratas X Interfaces
Uma classe abstrata pode conter métodos completos ou incompletos. Uma Interface pode conter apenas a assinatura de um método, mas nenhum corpo ou implementação. Portanto, em uma classe abstrata pode-se implementar métodos, mas em uma Interface não. Uma classe abstrata pode conter campos, construtores, ou destrutores e aplicar propriedades. Uma interface não pode conter campos, construtores, ou destrutores pode possuir apenas a propriedade da assinatura, mas não a implementação. Uma classe abstrata não suporta múltiplas heranças, mas uma interface pode suportar múltiplas herança. Assim, uma classe pode herdar várias interfaces, mas apenas uma classe abstrata. Uma classe que implementa uma interface tem de obrigatoriamente implementar todos os métodos da interface, mas o mesmo não é exigido no caso de uma classe abstrata. As classes abstratas são mais rápidas que as interfaces.
O que é uma classe selada? (Sealed Class)
Uma classe selada é utilizada para restringir características da herança do objeto, quando uma classe é definida como sealed, está classe não poderá ser herdada, caso você tente o compilador criara um erro em tempo de compilação, após criar uma classe selada pode se observar que o intelisense não mostra o nome da classe definida como sealed quando você tenta criar uma herança para novas classes.
Exemplo de implementação retirado do books online em C#.
sealed class ClasseSelada
{
public int x;
public int y;
}
class MainClass
{
static void Main()
{
ClasseSelada sc = new ClasseSelada();
sc.x = 110;
sc.y = 150;
Console.WriteLine("x = {0}, y = {1}", sc.x, sc.y);
}
}
Então, quando devo utilizar o que?
Classes Abstratas podem adicionar mais funcionalidades, sem destruir as funcionalidades das classes filhos que poderiam estar usando uma versão mais antiga. Classes abstratas fornecem uma maneira simples e fácil para versionar nossos componentes. Através da atualização da classe base, todas as classes que herdam são atualizadas automaticamente com a mudança. Em uma interface, a criação de funções adicionais terá um efeito sobre suas classes filhos, devido à necessidade de implementação dos Métodos criados na interface. Classes abstratas deveriam ser usadas principalmente para objetos que estão estritamente relacionados, enquanto o uso de interfaces é mais adequado para fornecer funcionalidade comum a classes independentes.
Digamos que existem duas classes, de pássaros e de aviões, e nas duas exista os métodos chamados voar(). Seria estranho para uma classe aviões herdar a partir de umas classe pássaros apenas porque necessita do método voar(). Em vez disso, o método voar() deve ser definido em uma interface e em ambas as classes pássaros e aviões devem implementar a interface. Se quisermos proporcionar uma funcionalidade em comum para os componentes, devemos utilizar uma classe abstrata.
Classes abstratas nos permitem implementar parcialmente uma classe, enquanto a interface não contem a implementação de qualquer membro. Por isso, a seleção de interface ou classes abstratas depende das necessidades e design do nosso projeto. Podemos fazer uma classe abstrata, interface, ou até uma combinação de ambas dependendo de nossas necessidades. Se desejarmos criar uma classe ou método interno para um componente ou library o ideal é utilizar o tipo sealed porque qualquer tentativa de anular algumas das suas funcionalidades não será permitida.
Nós podemos marcar uma classe ou método como selados por motivos comerciais, a fim de impedir um terceiro de modificar nossa classe. Por exemplo, no .NET a string é uma classe selada. Não devemos usar a palavra-chave sealed com um método a menos que o método seja uma mudança de outro método, ou se estamos definindo um novo método e não queremos que ninguém mais o sobreponha, não se deve declará-lo como virtual em primeiro lugar. a palavra-chave selado fornece uma maneira de garantir que ao sobrepor um método seja fornecido um "final" significa que ninguém mais poderá sobrepor-lo novamente.
Conclusão
Devemos utilizar classes abstratas quando queremos compartilhar funcionalidades em comum entre classes, e utilizar interfaces quando desejamos que uma classe possua as mesmas assinaturas porem a implementação de cada método não precise ser a mesma.
Referências
Working with Abstract classes, Sealed Classes, and Interfaces in C# by SANJIT SIL
Books online Microsoft
Padrões de projeto - Erich Gamma - Ralph Johnson - John Vlissides Cod do item:110053
15 comentários:
òtimo esse tutorial. Foi de grande ajuda. Continua postanto ... xau...abraçu
Fantástico... mandou muito bem, continue postando coisas do tipo.
Parabêns
muito bom este artigo!!!
vc deveria dar aulas!!!!
Parabens fiquei fã de seu blog; vou criar um add...
Tiago Xavier
Analista de Sistemas
Olha, depois de pesquisar e MTO na internet, a sua explicação da diferença entre classe abstrata e interface foi a melhor que eu já li! não sou de mandar postar comentário, mas este eu precisava, meu parabéns! agradeço mto o exclarecimento! já estava ficando sem esperança em achar uma resposta p/ minha dúvida! valew garoto!
Também não sou de ficar postando comentários, mas a sua explicação de classes Abstratas, Interfaces e Seladas foi a melhor que vi até hoje na internet. Parabéns.
parabéns, simples, objetivo e muito claro!
Muito bom na verdade eu provavelmente vou fazer o download. Graças
Com certeza, essa foi uma das melhores explicações sobre o assunto que já li.
Parabéns!
Hello trata-se a 1ª vez que encontrei o teu blog e reflecti imenso!Bom Projecto!
Até à próxima
Nota 10! Parabéns.
Vou passar a visitar com frequência seu blog!
Pefeito esta explicação a diferença entre classe abstrata e interface...até agora não tinha entendido como usar, qual usar mais aora ficou bastante claro.obg
Fantastico. Simples, direto, didático, consegui o que precisava em uma leitura rápida e direta. Parabéns.
Muito Obrigado Vanessa. Vc é fantástica. Por favor, continue, seu trabalho é simplesmente excelente!
Só uma dica, os códigos fonte poderiam ficar em campo de texto exclusivo, isso facilita bastante a leitura do código.
Postar um comentário