Jean, teoricamente vc não está usando o conceito de polimorfismo, pois vc está apenas com um objeto que tem vários métodos.
A ideia do polimorfismo é que você tenha um único objeto que pode assumir várias formas.
Olha este exemplo:
using System;
namespace ConsoleApp1
{
class Program
{
public interface IOperacoesMatematicas
{
public string GetDescricao();
public double Calcular(double num1, double num2);
}
// Implementa a interface;
public class Somar : IOperacoesMatematicas
{
public string GetDescricao()
{
return "Somar";
}
public double Calcular(double num1, double num2)
{
return num1 + num2;
}
}
// Implementa a interface;
public class Subtrair : IOperacoesMatematicas
{
public string GetDescricao()
{
return "Subtrair";
}
public double Calcular(double num1, double num2)
{
return num1 - num2;
}
}
static void Main(string[] args)
{
// Colocamos todas as possíveis opções de objetos que podem ser instanciados:
IOperacoesMatematicas[] operacoesDisponiveis = { new Somar(), new Subtrair() };
Console.WriteLine("Digite o primeiro número:");
double num1 = Convert.ToDouble(Console.ReadLine());
Console.WriteLine("Digite o segundo número:");
double num2 = Convert.ToDouble(Console.ReadLine());
Console.WriteLine("Digite o número da operação desejada, sendo:");
// A partir deste ponto, já começamos a aplicar o conceito de polimorfismo,
// dado que o método "GetDescricao()" só consegue ser chamado porque pertence
// a qualquer uma das formas que ele assuma, seja somar ou subtrair.
for (int i = 0; i < operacoesDisponiveis.Length; i++)
Console.WriteLine(i + " - " + operacoesDisponiveis[i].GetDescricao());
int operacaoEscolhida = Convert.ToInt32(Console.ReadLine());
// Se a operação escolhida não existir, fecha a aplicação.
if (operacaoEscolhida > operacoesDisponiveis.Length)
{
Console.WriteLine("Operação inválida");
Environment.Exit(1);
}
// A depender do valor que o usuário informar, o objeto "resultado" vai obter
// instâncias diferentes (formas diferentes/polimorfismo), mas não teremos
// erro na aplicação por conta disto.
IOperacoesMatematicas resultado = operacoesDisponiveis[operacaoEscolhida];
// Observar que neste ponto, o comportamento será dado pelo
Console.WriteLine("O resultado é :" + resultado.Calcular(num1, num2));
}
}
}
Com isto, perceba que IOperacoesMatematicas pode assumir comportamentos diferentes, a depender da forma como ele foi instanciado, ou seja, um outro exemplo básico seria o seguinte:
static void Main(string[] args)
{
double num1 = 5;
double num2 = 4;
IOperacoesMatematicas operacao = new Somar();
Console.WriteLine(operacao.Calcular(num1, num2));
operacao = new Subtrair();
Console.WriteLine(operacao.Calcular(num1, num2));
}
Observe que IOperacoesMatematicas está se comportando de forma diferentes, mas não deixa de ser "IOperacoesMatematicas".