Skip to content

Instantly share code, notes, and snippets.

@Fhernd
Last active July 31, 2016 22:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Fhernd/c86dbfdc466b34d79acc2d944e0e8d74 to your computer and use it in GitHub Desktop.
Save Fhernd/c86dbfdc466b34d79acc2d944e0e8d74 to your computer and use it in GitHub Desktop.
Demostración de la implementación de las interfaces IComparable y sobrecarga de operadores de comparación de orden < y >. [OritzOL]
void Main()
{
NotaMusical nm1 = new NotaMusical(1);
NotaMusical nm2 = new NotaMusical(2);
NotaMusical nm3 = new NotaMusical(1);
Console.WriteLine("nm1 == nm2 : " + (nm1 == nm2));
Console.WriteLine("nm1.Equals((object)nm2): " + nm1.Equals((object)nm2));
Console.WriteLine("nm1 == nm3 : " + (nm1 == nm3));
Console.WriteLine("nm1.Equals((object)nm2): " + nm1.Equals((object)nm3));
Console.WriteLine("nm1 < nm2: " + (nm1 < nm2));
Console.WriteLine("nm1 != nm2: " + (nm1 != nm2));
}
// Representa una nota musical:
public struct NotaMusical : IComparable, IComparable<NotaMusical>, IEquatable<NotaMusical>
{
// Representa el semitono de A:
int _semitonosDeA;
// Recupera el semitono de A:
public int SemitonosDeA
{
get
{
return _semitonosDeA;
}
}
// Crea una nueva instancia con un semitono de A:
public NotaMusical(int semitonosDeA)
{
_semitonosDeA = semitonosDeA;
}
// Implementa CompareTo de IComparable<NotaMusical>:
public int CompareTo(NotaMusical otroObj)
{
if (Equals(otroObj))
{
return 0;
}
// Efectúa la comparación entre números enteros:
return _semitonosDeA.CompareTo(otroObj._semitonosDeA);
}
// Implementa IComparable.CompareTo (versión no genérica):
int IComparable.CompareTo(object otroObj)
{
if (!(otroObj is NotaMusical))
{
throw new InvalidOperationException(
"CompareTo: `otroObj` no es un tipo NotaMusical");
}
return CompareTo((NotaMusical) otroObj);
}
// Sobrecarga el operador < para determinar la comparación de orden de un
// semitono de A respecto a otro:
public static bool operator <(NotaMusical nm1, NotaMusical nm2)
{
return nm1.CompareTo(nm2) < 0;
}
// Sobrecarga el operador > para determinar la comparación de orden de un
// semitono de A respecto a otro:
public static bool operator >(NotaMusical nm1, NotaMusical nm2)
{
return nm1.CompareTo(nm2) > 0;
}
// Implementación del método Equals de IEquatable<NotaMusical>:
public bool Equals(NotaMusical otroObj)
{
return _semitonosDeA == otroObj._semitonosDeA;
}
// Sobrescribe Object.Equals:
public override bool Equals(object otroObj)
{
if (!(otroObj is NotaMusical))
{
return false;
}
return Equals((NotaMusical)otroObj);
}
// Sobrescribe el método GetHashCode para calcular el hash
// de una nota musical:
public override int GetHashCode()
{
return _semitonosDeA.GetHashCode();
}
// Sobrecarga el operador == para efectuar una comparación de
// igualdad entre dos objetos NotaMusical:
public static bool operator ==(NotaMusical nm1, NotaMusical nm2)
{
return nm1.Equals(nm2);
}
// Sobrecarga el operador == para efectuar una comparación de
// igualdad entre dos objetos NotaMusical:
public static bool operator !=(NotaMusical nm1, NotaMusical nm2)
{
return !(nm1 == nm2);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment