Non riesco a afferrare logicamente come si richiama il metodo CompareT...

venerdì 25 settembre 2009 - 10.23

cosmopsis Profilo | Junior Member

Ho trovato questo esempio in rete (l'ho adattato un po' rispetto all'originale) . Riguarda l'interfaccia IComparable.
Bisogna ordinare un'array di oggetti punti di classe Point.

class App {
static void Main(string[] args) {
Point[] punti = new Point[5];
punti[0] = new Point(2, 2);
punti[1] = new Point(3, 2);
punti[2] = new Point(2, 3);
punti[3] = new Point(7, 8);
punti[4] = new Point(0, 1);

Array.Sort(punti); //qui si confrontano gli oggetti presenti nell'array

for(Int32 i = 0; i < punti.Length; i++){
Console.WriteLine("Punto {0}: {1}", i, punti[i]);
}
Console.Read();
}
}//fine classe App

La classe Point (che definisce l'interfaccia) è definita così:

class Point : IComparable
{
public Int32 x, y;

public Point(Int32 x, Int32 y)
{
this.x = x;
this.y = y;
}

// CompareTo è definita dall'interface IComparable
public Int32 CompareTo(Object other)
{
Point p = (Point)other;
Double xx = Math.Sqrt(x * x + y * y);
Double yy = Math.Sqrt(p.x * p.x + p.y * p.y);
return (Math.Sign(xx - yy));
}

public override String ToString()
{
return (String.Format("({0}, {1})", x, y));
}
}

Il problema è che (come da oggetto) non riesco ad afferrare logicamente come si richiama il metodo CompareTo (nell'esempio) quando si esegue l'istruzione Array.Sort(punti). Qualcuno mi può far capire?
Grazie.

phai Profilo | Newbie


>Il problema è che (come da oggetto) non riesco ad afferrare logicamente
>come si richiama il metodo CompareTo (nell'esempio) quando si
>esegue l'istruzione Array.Sort(punti). Qualcuno mi può far capire?

Ciao,

SE HO BEN CAPITO non afferri il meccanismo che permette di richiamare il CompareTo quando si invoca un Sort.

Di solito in altri linguaggi in cui sono definiti i comparatori (pertanto molto probabilmente anche in C#) quando si invoca un metodo di ordinamento (Sort in questo caso) è la virtual machine che, in fase di runtime, verifica se l'oggetto implementa il comparatore.
Nel tuo caso l'oggetto lo implementa e pertanto esegue l'algoritmo di ordinamento che tu hai definito (implementando così l'interfaccia IComparable) per decidere il criterio da seguire per l'ordinamento. L'algoritmo per l'rdinamento, invece, è stabilito dall'implementazione nel framework del metodo Sort.

Se l'oggetto fosse un numero l'ordinamento da seguire sarebbe numerico, se fosse una stringa sarebbe alfabetico, e così via (in alcuni linguaggi per gli oggetti in cui non è definito avviene sulla base della rappresentazione stringa dell'oggetto)... implementando l'interfaccia quindi tu non definisci l'algoritmo di ordinamento, ma i parametri di verifica dell'ordinamento stesso che vengono richiamati in automatico.

cosmopsis Profilo | Junior Member

Ok ho capito. Grazie.
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5