Classes parciais, abstratas e seladas com C#
Os modificadores acima citados são utilizados para alterar declarações de tipo e membros de tipo.
O que?
Calma, vamos compreender cada um deles, aplicando um cenário para obtermos um completa assimilação do que cada um faz, como e quando utiliza-los.
Classe Parcial (partial class)
Cenário 1
Vamos pensar em um cenário onde a equipe de desenvolvimento está trabalhando em um projeto, e dois programadores precisam trabalhar na classe Cliente. Caso o cenário seja muito complexo e difícil de realizar um merge posterior, cada programador pode trabalhar em um arquivo separado, declarando o modificador partial que o compilador saberá que se trata da mesma classe e irá tratar como uma só.
Exemplo:
Elas se tornarão uma só com as duas propriedades e o método.
Cenário 2
Este outro cenário é mais comum, quando utilizamos um ORM.
Pegarei como exemplo a utilização do EntityFramework, modelo Database First. Este modelo parte do principio que você possui o banco de dados(Geralmente proveniente do legado da empresa) e utiliza a ferramente do EF para gerar suas classes de domínio.
Neste caso você não deve alterar essas classes geradas automaticamente, porém você quer utilizar Data Annotations para criar validações e até mesmo modificar a exibição na tela, pois você está utilizando o Scaffolding do Visual Studio.
Então nesse caso também criamos uma classe Parcial, onde escrevemos todas as nossas customizações.
Não termos mais problema em modificar um arquivo gerado automaticamente, onde perderíamos o código customizado em próximo uso do EF
Classe Abstrata (abstract class)
Uma classe com o modificador abstract indica que essa classe não pode ser instanciada.
Pra que serve então?
Um cenário simples é o caso clássico de orientação a objeto de Herança, onde temos classes filhas que herdam de uma pai, porém a classe pai não faz sentido ser instanciada, ela serve apenas como base para as demais.
Neste caso para que ela não seja instanciada, marcamos ela com sendo abstrata.
Também é comum vermos a termo Classe Incompleta para uma classe abstrata.
Neste modelo, temos uma classe base (ou classe pai) Pessoa e duas classes filhas que herdam dela. Nas classes filhas podemos então sobrescrever o método Atualizar, para adicionar a lógica necessária.
Aqui já entramos em polimorfismo e herança, porém deixarei para conceitualizar Polimorfismo, Herança e Encapsulamento em um próximo artigo
Classe selada (sealed)
A classe selada, por sua vez impede que outras classes herdem dela. É o oposto da abstrata, onde precisa de herdeiros para fazer sentido.
Pensamos em uma aplicação onde temos várias classes gerando um hierarquia de heranças. Um Superclasse que é herdade por uma subclasse (filha) que é herdade por uma terceira… podemos ir longe com isso. Para que isso não ocorra, marcamo a classe com o modificador sealed.
Chamamos uma classe selada, de classe pronta, pois não será herdade e não terá sobrescrita de métodos.
Concluindo
Existem vário outros modificadores de comportamento e também modificadores de acesso, serão abordados em um próximo artigo.
Preciso utilizar isso?
Depende. Você pode construir uma aplicação inteira sem utilizar estes modificadores. De acordo com a maturidade da aplicação e conhecimento técnico, necessidades vão surgindo. Esses modificadores são utilizados em conjunto com outros artefatos da programação OO, Interfaces etc.. Por enquanto o foco foi contextualizar a definição. Depois veremos esses modificadores em conjunto com paradigmas da Orientação a Objetos.