/* Esittelee lyhyesti seuraavat C#:n ominaisuudet Enumerattorit Ominaisuudet Indeksoijat Muuttujamodifierit Ylikuormituksen Delegaatit Eventit Attribuutit Reflektoinnin */ using System; using System.Collections; using System.Reflection; namespace Esimerkki { public enum Rajoitus { Lisays, Poisto } [AttributeUsage( AttributeTargets.Class )] public class TapahtumaRajoitusAttribute : Attribute { private Rajoitus m_Rajoitus; public Rajoitus Rajoitus { get { return m_Rajoitus; } } public TapahtumaRajoitusAttribute( Rajoitus rajoitus ) { m_Rajoitus = rajoitus; } } [TapahtumaRajoitus( Rajoitus.Lisays )] public class Asiakirja : Kirja { public Asiakirja( string otsikko, ISBN isbn ) : base( otsikko, isbn ) { } } public class Kirja { private string m_Otsikko; private ISBN m_ISBN; public Kirja( string otsikko, ISBN isbn ) { m_Otsikko = otsikko; m_ISBN = isbn; } public override string ToString() { return m_Otsikko + " (" + m_ISBN + ")" ; } public static bool operator == ( Kirja k1, Kirja k2 ) { return k1.m_ISBN == k2.m_ISBN; } public static bool operator != ( Kirja k1, Kirja k2 ) { return k1.m_ISBN != k2.m_ISBN; } public override int GetHashCode() { return m_ISBN.GetHashCode(); } public override bool Equals( object o ) { if ( !( o is Kirja ) ) return false; return ((Kirja)o).m_ISBN == this.m_ISBN; } } public class ISBN { private long m_Number; public ISBN() { m_Number = 0; } public override string ToString() { string number = String.Format( "{0:d13}", m_Number ); number = number.Insert( 3, "-" ); number = number.Insert( 5, "-" ); number = number.Insert( 12, "-" ); number = number.Insert( 15, "-" ); return number; } public static implicit operator ISBN( long number ) { ISBN isbn = new ISBN(); isbn.m_Number = number; return isbn; } public static bool operator == ( ISBN i1, ISBN i2 ) { return i1.m_Number == i2.m_Number; } public static bool operator != ( ISBN i1, ISBN i2 ) { return i1.m_Number != i2.m_Number; } public override int GetHashCode() { return (int)(this.m_Number >> 32) ^ (int)(this.m_Number); } public override bool Equals( object o ) { if ( !( o is ISBN ) ) return false; return ((ISBN)o).m_Number == this.m_Number; } } public delegate void KirjaTapahtumaKasittelija( Kirja kirja ); public class Kirjasto { private ArrayList m_Kirjat; private string m_Nimi; public event KirjaTapahtumaKasittelija LisaysKasittelija; public event KirjaTapahtumaKasittelija PoistoKasittelija; public Kirjasto() { LisaysKasittelija = null; PoistoKasittelija = null; m_Kirjat = new ArrayList(); m_Nimi = "Nimetön"; } ~Kirjasto() { Console.WriteLine( "Kirjaston hajottajaa kutsuttiin" ); } public string Nimi { get { return m_Nimi; } set { m_Nimi = value; } } public int KirjojenMaara { get { return m_Kirjat.Count; } } public bool OnKirjoja( out int maara ) { maara = KirjojenMaara; return KirjojenMaara > 0; } private bool OnRajoitus( Type tyyppi, Rajoitus rajoitus ) { object[] attribuutit = tyyppi.GetCustomAttributes( typeof( TapahtumaRajoitusAttribute ), true ); foreach ( TapahtumaRajoitusAttribute tra in attribuutit ) { if ( tra.Rajoitus == rajoitus ) { return true; } } return false; } public void Lisaa( Kirja kirja ) { m_Kirjat.Add( kirja ); if ( !OnRajoitus( kirja.GetType(), Rajoitus.Lisays ) ) { if ( LisaysKasittelija != null ) { LisaysKasittelija( kirja ); } } } public void Poista( Kirja kirja ) { m_Kirjat.Remove( kirja ); if ( !OnRajoitus( kirja.GetType(), Rajoitus.Poisto ) ) { if ( PoistoKasittelija != null ) { PoistoKasittelija( kirja ); } } } public Kirja this[ ISBN isbn ] { get { foreach ( Kirja kirja in this ) { if ( kirja.GetHashCode() == isbn.GetHashCode() ) { return kirja; } } return null; } } public Kirja this[ int index ] { get { if ( index < 0 || index > KirjojenMaara - 1 ) return null; return m_Kirjat[index] as Kirja; } } public IEnumerator GetEnumerator() { return m_Kirjat.GetEnumerator(); } } public class Testi { static void Main( string[] args ) { Kirjasto kirjasto = new Kirjasto(); kirjasto.LisaysKasittelija += new KirjaTapahtumaKasittelija( KirjaLisatty ); kirjasto.PoistoKasittelija += new KirjaTapahtumaKasittelija( KirjaPoistettu ); ToinenTesti.Alusta( kirjasto ); Kirja eka = new Kirja( "Ensimmäinen", 9781873661003 ); kirjasto.Lisaa( eka ); Console.WriteLine( kirjasto[0] ); kirjasto.Lisaa( new Kirja( "Toinen", 9781873671000 ) ); kirjasto.Lisaa( new Asiakirja( "Salainen", 0 ) ); Console.WriteLine( "\nTulostetaan kirjat kirjastosta {0}:", kirjasto.Nimi ); foreach ( Kirja kirja in kirjasto ) { Console.WriteLine( " {0}", kirja ); } int kirjoja; if ( kirjasto.OnKirjoja( out kirjoja ) ) { Console.WriteLine( "Kirjastossa on {0} kirjaa", kirjoja ); } Console.WriteLine(); ISBN isbn = 9781873661003; Console.WriteLine( isbn ); Console.WriteLine( "Haku isbn numerolla: {0}", kirjasto[isbn] ); Console.WriteLine( kirjasto[0] == kirjasto[1] ); kirjasto.Poista( eka ); Assembly assembly = Assembly.GetEntryAssembly(); foreach ( Type tyyppi in assembly.GetTypes() ) { Console.WriteLine( " - Ladattu tyyppi: {0}", tyyppi.Name ); } Console.WriteLine( "Main() päättyy" ); } private static void KirjaLisatty( Kirja kirja ) { Console.WriteLine( "Kirja {0} lisättiin", kirja ); } private static void KirjaPoistettu( Kirja kirja ) { Console.WriteLine( "Kirja {0} poistettiin", kirja ); } } public class ToinenTesti { public static void Alusta( Kirjasto kirjasto ) { kirjasto.PoistoKasittelija += new KirjaTapahtumaKasittelija( KirjaPoistettiin ); } private static void KirjaPoistettiin( Kirja kirja ) { Console.WriteLine( "Kirja {0} poistettiin ja toinenkin huomasi sen", kirja ); } } }