Esse post não será mais atualizado nesse blog. Para visualizar esse post em seu novo endereço, acesse:
http://milaneze.com.br/post/2009/07/07/C-Interface.aspx
É uma classe que não possui atributos, apenas métodos, porém esses não possuem implementação. Toda classe derivada de uma interface deve implementar todos seus métodos. Se a classe não implementa todos os métodos, o método que não foi implementado deve ser declarado como abstrata e, por consequência, essa classe deve ser abstrata.
Diferenças entre classe abstrata e interface
As semelhanças entre classe abstrata e interface são muitas. Uma interface é utilizada quando não existe a necessidade das classes derivadas herdarem métodos já implementados. Outra diferença é que interfaces não permitem a declaração de atributos, como as classes abstratas.O próximo exemplo demonstra como uma interface é declarada e usada. A classe
IPagavel é uma interface que é implementada pelas classes
Invoice e
Empregado (classe abastrata). A classe
EmpregadoAssalariado é derivada da classe
Empregado.
Classe IPagavel 1: public interface IPagavel
2: { 3: decimal getQuantidadePagar();
4: }
Classe Invoice 1: class Invoice : IPagavel
2: { 3: private string partNumber;
4: private string partDescription;
5: private int quantidade;
6: private decimal precoPorItem;
7:
8: public Invoice(string part, string descricao, int quantidade, decimal preco)
9: { 10: partNumber = part;
11: partDescription = descricao;
12: this.quantidade = quantidade;
13: precoPorItem = preco;
14: }
15:
16: public string PartNumber
17: { 18: get
19: { 20: return partNumber;
21: }
22:
23: set
24: { 25: partNumber = value;
26: }
27: }
28:
29: public string PartDescription
30: { 31: get
32: { 33: return partDescription;
34: }
35:
36: set
37: { 38: partDescription = value;
39: }
40: }
41:
42: public int Quantidade
43: { 44: get
45: { 46: return quantidade;
47: }
48:
49: set
50: { 51: quantidade = (value < 0) ? 0 : value;
52: }
53: }
54:
55: public decimal PrecoPorItem
56: { 57: get
58: { 59: return precoPorItem;
60: }
61:
62: set
63: { 64: precoPorItem = (value < 0) ? 0 : value;
65: }
66: }
67:
68: public override string ToString()
69: { 70: return string.Format("{0}: \n{1}: {2} ({3}) \n{4}: {5} \n{6}: {7:C}", "invoice", "part number", PartNumber, PartDescription, "quantity", Quantidade, "price per item", PrecoPorItem); 71: }
72:
73: public decimal getQuantidadePagar()
74: { 75: return Quantidade * PrecoPorItem;
76: }
77: }
Classe Empregado 1: abstract class Empregado : IPagavel
2: { 3: private string primeiroNome;
4: private string ultimoNome;
5: private string numeroSeguroSocial;
6:
7: public Empregado(string primeiro, string segundo, string ssn)
8: { 9: primeiroNome = primeiro;
10: ultimoNome = segundo;
11: numeroSeguroSocial = ssn;
12: }
13:
14: public string PrimeiroNome
15: { 16: get
17: { 18: return primeiroNome;
19: }
20: }
21:
22: public string UltimoNome
23: { 24: get
25: { 26: return ultimoNome;
27: }
28: }
29:
30: public string NumeroSeguroSocial
31: { 32: get
33: { 34: return numeroSeguroSocial;
35: }
36: }
37:
38: public override string ToString()
39: { 40: return string.Format("{0} {1}\nsocial security number: {2}", PrimeiroNome, UltimoNome, NumeroSeguroSocial); 41: }
42:
43: public abstract decimal getQuantidadePagar();
44: }
Classe EmpregadoAssalariado 1: class EmpregadoAssalariado : Empregado
2: { 3: private decimal salarioSemanal;
4:
5: public EmpregadoAssalariado(string primeiro, string ultimo, string ssn, decimal salario)
6: : base(primeiro, ultimo, ssn)
7: { 8: SalarioSemanal = salario;
9: }
10:
11: public decimal SalarioSemanal
12: { 13: get
14: { 15: return salarioSemanal;
16: }
17:
18: set
19: { 20: salarioSemanal = value < 0 ? 0 : value;
21: }
22: }
23:
24: public override decimal getQuantidadePagar()
25: { 26: return SalarioSemanal;
27: }
28:
29: public override string ToString()
30: { 31: return string.Format("empregado assalariado: {0}\n{1}: {2:C}", base.ToString(), "salário semanal", SalarioSemanal); 32: }
33: }
Implementação das classes 1: class Program
2: { 3: static void Main(string[] args)
4: { 5: IPagavel[] objetosPagaveis = new IPagavel[4];
6:
7: objetosPagaveis[0] = new Invoice("1234", "cadeira", 2, 400.00M); 8: objetosPagaveis[1] = new Invoice("9876", "pneu", 4, 80.00M); 9: objetosPagaveis[2] = new EmpregadoAssalariado("Eric", "Milaneze", "111-111-111", 750.00M); 10: objetosPagaveis[3] = new EmpregadoAssalariado("Thiago", "Milaneze", "222-222-222", 1500.00M); 11:
12: Console.WriteLine("Invoices e Empregados processados polimorficamente:\n"); 13:
14: foreach (IPagavel pagavelAtual in objetosPagaveis)
15: { 16: Console.WriteLine( "{0} \n{1}: {2:C}\n", pagavelAtual, "pagamento", pagavelAtual.getQuantidadePagar() ); 17: }
18:
19: Console.ReadLine();
20: }
21: }