Blog Stats
  • Posts - 16
  • Articles - 0
  • Comments - 123
  • Trackbacks - 31

 

lunedì 2 luglio 2007

[70-553] – 1. Section 1 – 1. Dev application – 4 – Standard interfaces

Implement .NET Framework interfaces to cause components to comply with standard contracts

 

E’ buona norma uniformare il comportamento delle proprie classi a quelli degli oggetti standard del framework, in tal modo l’uso nell’applicazione non è un “caso speciale”, ma è assolutamente coerente con il resto. Ci sono percio’ delle interfaccie pensate apposta:

IComparable: ha un unico metodo CompareTo per effettuare controlli ed ordinamenti , l’ho usata in  [70-553] – 1. Section 1 – 1. Dev application – 1 – Manage data (4)

IDisposable: definisce il metodo Dispose per gestire una eventuale disallocazione specifica e dettagliata delle risorse.

IConvertible: permette di definire diversi metodi di conversione della classe in interi, stringhe, date..etc..

ICloneable: per avere un metodo Clone che copia l’oggetto in ogni sua parte

INullableValue: per avere il metodo IsNull, per indicare che una istanza (magari di tipo valueType) è nulla. Es. ObjectId nell’Autodesk DOTNETARX  ha il metodo IsNull per indicare identificativo nullo, è un metodo che semplicemente controlla che l’identificativo interno dell’id sia ancora al valore 0, iniziale, generato dal costruttore di default.

IFormattable: ha il metodo ToString().. quindi alcuni giorni fa avrei dovuto usarlo...

IEquatable: ha il metodo Equals per contollare che due oggetti siano da considerare uguali.

 

Nei miei testi, per controllare che due punti siano uguali, non è possibile controllare che x,y,z siano identici, perchè puo’ succedere che qualche cifra decimale da un certo punto poi sia differente, soprattuto in caso di operazioni matematiche.

Definisco allora che la classe implementi l’interfaccia IEquatable per effettuare l’operazione di compare: due punti sono identici se la loro distanz a è sotto una certa soglia.

 

   public struct PuntoStruct: IComparable < PuntoStruct >, IEquatable<PuntoStruct>, IFormattable

   {

       private double _x, _y, _z;

       public PuntoStruct(double x1, double y1, double z1)

      ……

       public bool Equals(PuntoStruct other)

       {

         double d = Math.Sqrt(Math.Pow(_x - other._x, 2.0) +

        Math.Pow(_y - other._y, 2.0) +

        Math.Pow(_z - other._z, 2.0));

         return (d < 0.0001);

       }

   }

Che si usa :

    PuntoStruct p0 = new PuntoStruct(0, 0, 0);

    PuntoStruct p1 = new PuntoStruct(0.000001, 0.000001, 0.000001);

    PuntoStruct p2 = new PuntoStruct(2, 4, 3);

    if (p1.Equals(p0))

        Console.WriteLine(" ( {0} ) == ( {1} )  ", p0.ToString(), p1.ToString());

           

    if (p2.Equals(p0))

        Console.WriteLine(" ( {0} ) == ( {1} )  ", p0.ToString(), p2.ToString());

 

 

E’ chiaro che p1 viene considerato identico a p0, perchè la loro distanza è sotto la soglia di 0.0001,

mentre p2 è diverso da p0!

 

 

Copyright © Bruna Gavioli