O documento discute conceitos de covariância e contravariância em C# 4, incluindo: (1) covariância em arrays, onde arrays suportam apenas covariância; (2) tipos genéricos, que são tipos com parâmetros de tipo; (3) variância em tipos genéricos, onde covariância permite passar X<TDerivado> para X<TBase> e contravariância permite passar X<TBase> para X<TDerivado>.
MVP Virtual Conference 2013: Suporte a padrões Web
MSDN Webcast: Trabalhando com covariância e contravariância no C# 4
1. quinta-feira, 30 de setembro de 2010 Trabalhando com covariânciae contravariância no C# 4 RogérioMoraes de Carvalho Consultor e Instrutor de TI VITA Informática Twitter: @rogeriomc
2. Agenda do WebCastTópicos a serem apresentados Hierarquia entre tipos de dados Demonstração Covariância em arrays Demonstração Tipos genéricos Demonstração Variância em tipos genéricos Demonstração 2
3. Hierarquia entre tipos de dadosRelação de herança entre tipos de dados Pilares da Programação Orientada a Objetos Encapsulamento Ocultar o máximo do comportamento e dos dados Herança Permite criar uma nova classe, denominada derivada, que reutiliza, estende e pode modificar o comportamento e os dados de uma classe base Polimorfismo Habilidade de objetos de diferentes tipos de dados serem manipulados usando interfaces comuns 3
4. Hierarquia entre tipos de dadosRelação de herança entre tipos de dados Conceitos relacionados com herança em C# Classe abstrata (tipo por referência) Uma classe projetada somente para herança, ou seja, para outras classes derivarem dela Não pode ser instanciada com o operador new Seus membros abstratos devem ser implementados nas classes derivadas Interface (tipo por referência) Definem contratos que devem ser implementados Similar a uma classe abstrata com todos os membros abstratos Porém, uma classe pode implementar múltiplas interfaces, mas somente pode herdar de uma única classe abstrata 4
5. Hierarquia entre tipos de dadosRelação de herança entre tipos de dados Conceitos relacionados com herança em C# Membros abstratos e virtuais Membros abstratos de uma classe abstrata base devem ser sobrescritos numa classe derivada concreta Membros virtuais numa classe base podem ser sobrescritos numa classe derivada Fornecendo a sua própria implementação Membros virtuais também são chamados de polimórficos Membros que podem ser virtuais ou abstratos Métodos, propriedades, indexadores ou eventos 5
7. Covariância em arraysArrayssuportam somente covariância Sejam A e B dois tipos por referência Se uma conversão implícita ou explícita é possível entre os tipos A e B Então esta mesma conversão será possível entre arrays com elementos dos tipos A e B, respectivamente, e o mesmo número de dimensões Efeito colateral da covariância em arrays Tipos arraysde tipos por referência incluem verificação em tempo de execução para atribuição de elementos Se a atribuição for inválida, então a exceção System.ArrayTypeMismatchException é lançada 7
9. Tipos genéricosConceito e aplicações São tipos que tem parâmetros de tipo para um ou mais dos tipos que eles armazenam ou usam Tipos classes, estruturas, interfaces e delegates podem ser genéricos Além de tipos, membros métodos de um tipo podem ser genéricos Alguns tipos genéricos no .NET Framework Classe Dictionary<TKey, TValue> Interface IList<T> 9
11. Variância em tipos genéricosCovariância e contravariância em tipos genéricos Se T aparece somente como uma saída (out), então é seguro passarX<TDerivado> para X<TBase> Este processo é chamado covariância Sintaxe em C#: X<out T> Se T aparece somente como uma entrada (input), então é seguro passarX<TBase> para X<TDerivado> Este processo é chamado contravariância Sintaxe em C#: X<in T> 11
12. Variância em tipos genéricosCovariância e contravariância em tipos genéricos Em C# 3.0, tipos genéricos eram invariantes C# 4 suporta covariância e contravariância em interfaces e delegates genéricos Não suporta em classes e nem em estruturas À partir do .NET Framework 4, diversas interfaces genéricas têm parâmetros de tipo Covariantes IEnumerable<out T>, IQueryable<out T>, ... Contravariantes IComparable<in T>, IComparer<in T>, ... 12
14. Artigos e vídeos recomendadosMais informações sobre variância em C# 4 Array covariance http://msdn.microsoft.com/en-us/library/aa664572(VS.71).aspx How Do I: Use Covariance and Contravariance in VS 2010 Part I? (Vídeopor Eric Lippert, Microsoft Engineer) http://msdn.microsoft.com/en-us/vcsharp/ee672314.aspx How Do I: Use Covariance and Contravariance in VS 2010 Part II? (Vídeopor Eric Lippert, Microsoft Engineer) http://msdn.microsoft.com/en-us/vcsharp/ee672319.aspx Covariance and Contravariance (C# and Visual Basic) http://msdn.microsoft.com/en-us/library/ee207183.aspx Covariance and Contravariance in Generics http://msdn.microsoft.com/en-us/library/dd799517.aspx 14