Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

C# II - OO [Interfaces e instâncias de classe]

No exercicio 10 do curso de C# II está descrito o seguinte:

(```) interface ITributavel { double CalculaTributo(); }

class ContaPoupanca : Conta, ITributavel { // resto da classe aqui

public double CalculaTributo() { return this.Saldo * 0.02; } }

class ContaInvestimento : Conta, ITributavel { public double CalculaTributo() { return this.Saldo * 0.03; } }

class TotalizadorDeTributos { public double Total { get; private set; }

public void Acumula(ITributavel t) { Total += t.CalculaTributo(); } }

class Programa { static void Main(string[] args) { TotalizadorDeTributos t = new TotalizadorDeTributos(); ContaInvestimento ci = new ContaInvestimento(); ContaPoupanca cp = new ContaPoupanca();

ci.Deposita(100.0); cp.Deposita(100.0);

t.Acumula(ci); t.Acumula(cp);

Console.WriteLine("O total é: " + t.Total); } }(```)

Minha duvida é aqui:

(```) class TotalizadorDeTributos { public double Total { get; private set; }

public void Acumula(ITributavel t) { Total += t.CalculaTributo(); } (```)

Pelo que entendi, a classe ITributavel é uma interface e não pode ser instanciada, mas como pode entao o método Acumula receber uma instancia de ITributavel?

Alguem da um help?

3 respostas
solução!

Isso que é o polimorfismo, você usa o ITributavel como se fosse um tipo, então você pode receber nele toda classe que implemente ITributavel.

Usando com herança é a mesma coisa, você pode por em um argumento o tipo Conta e passar como parametro qualquer classe que herde de Conta.

Neste caso você não está instanciando um ITributavel mas sim uma classe que implemente ITributavel, isso é uma das facilidades da OO.

Não sei se ficou bem claro. qualquer coisa fala ai.

A herança permite ao filho herdar tudo da classe pai. A interface não é uma classe filha de ninguém, ela apenas determina que toda classe (pai ou filha, as duas situações?) que tenha na sua assinatura uma referência para determinada interface seja obrigada a implementar o método descrito dentro da interface. Dúvida: Permite que apenas as classes que tenham o "contrato" assinado tenham seus métodos obrigatórios interfaceados de uma só vez em uma chamada externa?

Ela não pode ser instanciada pois não é uma classe, mas pode ser passada como parâmetro, pois indica um tipo.

É como falar sobre quadrados e retângulos, todo quadrado é retângulo, mas nem todo retângulo é quadrado.

Uma classe pode ser usada como parâmetro ou instanciada, já uma interface pode apenas ser passada como parâmetro, não podendo ser instanciada.