//
// 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;

namespace CLRUnleashed
{
	class A
	{
		public virtual void Message() 
		{
			Console.WriteLine("To jest wiadomość z A");
		}
	}
	sealed class B: A
	{
		public override void Message() 
		{
			Console.WriteLine("To jest wiadomość z B");
		}
	}
	class C: A
	{
		// methodhideoverride.cs(21,15): warning CS0114: 'CLRUnleashed.C.Message()'
		// hides inherited member 'CLRUnleashed.A.Message()'. To make the current
		// member override that implementation, add the override keyword. Otherwise
		// add the new keyword.
		// public void Message() 
		public new void Message() 
		{
			Console.WriteLine("This is a message from C");
		}
	}
	// Usuń znaki komentarza poniżej, aby uzyskać komunikat o błędzie
	// MethodHideOverride.cs(31): 'CLRUnleashed.D' : cannot inherit from 
	// sealed class 'CLRUnleashed.B'
	// class D: B
	// {
	// 	public override void Message() 
	// 	{
	// 		Console.WriteLine("To jest wiadomość z D");
	// 	}
	// }

	/// <summary>
	/// Podsumowanie dla MethodHideOverride.
	/// </summary>
	class MethodHideOverride
	{
		/// <summary>
		/// Główny punkt wejścia dla aplikacji.
		/// </summary>
		[STAThread]
		static void Main(string[] args)
		{
			// Podstawowe dziedziczenie
			Console.WriteLine("---- metoda A");
			A a = new A();
			a.Message();
			Console.WriteLine("---- metoda B");
			B b = new B();
			b.Message();
			Console.WriteLine("---- Rzutowanie B do metody A");
			((A)b).Message();
			
			// Hide a method
			Console.WriteLine("---- metoda C");
			C c = new C();
			c.Message();
			Console.WriteLine("---- Rzutowanie C do metody A");
			((A)c).Message();
		}
	}
}
