//
// Copyright (c) 2002
// Ronald Kevin Burton
//
// Z poniższym kodem nie jest związana żadna gwarancja poprawności działania.
// Program został dołączony do książki ".NET CLR. Księga eksperta" w celu
// ilustracji koncepcji i zasad przedstawionych w tej książce. Program może być 
// używany na własne ryzyko.
//
// Przyznaje się prawo do użycia lub kopiowania tego oprogramowania do dowolnego celu
// bez konieczności ponoszenia żadnych opłat pod warunkiem, że powyższe uwagi zostaną 
// zachowane we wszystkich kopiach. Przyznaje się także prawo do modyfikacji kodu
// i dystrybucji zmodyfikowanego kodu pod warunkiem zachowania powyższych uwag
// oraz dołączenia informacji mówiącej o modyfikacji kodu.
//
// 
using System;
using System.Reflection;
using System.Security.Permissions;

namespace TypeSampler
{
	// Zdefiniowany przez użytkownika typ wartości.
	public struct MyStruct
	{
		public int a;
		public int b;
	}

	public enum Sample { Sample1, Sample2, Sample3};

	// Interfejsy
	public interface IMyInterface
	{
		// Metoda zwraca tablicę
		string [] MyInterfaceMethod();
	}
	public interface IYourInterface
	{
		void YourInterfaceMethod(MyDelegate callback);
	}

	// Delegat
	public delegate void MyDelegate(string msg);

	// Klasa
	[Serializable]
	public class MyClass: IMyInterface, IYourInterface
	{
		// Pola
		private int myInt;
		private string myString;
		private Sample mySample;

		// Konstruktor
		public MyClass()
		{
			myInt = 0;
			myString = Assembly.GetCallingAssembly().FullName;
		}
		// Metoda
		public MyStruct MyMethod(int a, int b)
		{
			MyStruct ms = new MyStruct();
			ms.a = a;
			ms.b = b;
			return ms;
		}

		// Implementacje interfejsu
		public string [] MyInterfaceMethod()
		{
			string [] returnArray = new string[] {"Ten", "tekst", "został", "zwrócony", "z", "MyMethod", "w", "IMyInterface"};
			return returnArray;
		}

		public void YourInterfaceMethod(MyDelegate yourCallback)
		{
			yourCallback("Hej ty!");
		}

		// Właściwość
		public int MyInt
		{
			get
			{
				return myInt;
			}
			set
			{
				myInt = value;
			}
		}

		// Inna właściwość
		public string MyString
		{
			get
			{
				return myString;
			}
		}

		// Jeszcze inna właściwość
		public Sample MyEnum
		{
			get
			{
				return mySample;
			}
			set
			{
				mySample = value;
			}
		}
	}
}
