public interface IExpressao
public class Numero : IExpressao
public Numero(int numero)
public class Soma : IExpressao
private IExpressao esquerda;
private IExpressao direita;
public Soma(IExpressao esquerda, IExpressao direita)
this.esquerda = esquerda;
return esquerda.Avalia() + direita.Avalia();
public class Subtracao : IExpressao
private IExpressao esquerda;
private IExpressao direita;
public Subtracao(IExpressao esquerda, IExpressao direita)
this.esquerda = esquerda;
return esquerda.Avalia() - direita.Avalia();
public class Multiplicacao : IExpressao
private IExpressao esquerda;
private IExpressao direita;
public Multiplicacao(IExpressao esquerda, IExpressao direita)
this.esquerda = esquerda;
return esquerda.Avalia() * direita.Avalia();
public class Divisao : IExpressao
private IExpressao esquerda;
private IExpressao direita;
public Divisao(IExpressao esquerda, IExpressao direita)
this.esquerda = esquerda;
return esquerda.Avalia() / direita.Avalia();
public class RaizQuadrada : IExpressao
private IExpressao operando;
public RaizQuadrada(IExpressao operando)
this.operando = operando;
return (int)Math.Sqrt(operando.Avalia());
public static void Main()
IExpressao expressao = new Soma(new Multiplicacao(new Numero(10), new Numero(7)), new Subtracao(new Numero(5), new Divisao(new Numero(50), new Numero(5))));
Console.WriteLine(expressao.Avalia());