using System;

public class Window
{
	// Konstruktor przyjmuje dwie liczby całkowite, aby
	// określić położenie konsoli
	public Window(int top, int left)
	{
		this.top = top;
		this.left = left;
	}

	// Symulacja rysowania okna
	public virtual void DrawWindow()
	{
		Console.WriteLine("Window: rysowanie okna w punkcie {0}, {1}",
		   top, left);
	}

	// Te składowe są chronione, dlatego są widoczne
	// w metodach klasy pochodnej. Jest to opisane w dalszej
	// części tego rozdziału. (Zwykle takie składowe deklaruje się jako prywatne i
	// i opakowuje w chronione właściwości, ale ta wersja
	// upraszcza przykład.)
	protected int top;
	protected int left;

} // koniec Window

// Klasa ListBox dziedziczy po klasie Window
public class ListBox : Window
{
	// Konstruktor ma nowy parametr 
	// i wywołuje konstruktor klasy bazowej
	public ListBox(
	   int top,
	   int left,
	   string contents)
		: base(top, left)
	{
		listBoxContents = contents;
	}

	// Trzeba przesłonić wersję klasy bazowej (słowo kluczowe), ponieważ 
	// metoda klasy pochodnej działa w inny sposób
	public override void DrawWindow()
	{
		base.DrawWindow(); // Wywołanie metody klasy bazowej
		Console.WriteLine("Zapis łańcucha znaków do kontrolki klasy ListBox: {0}",
		   listBoxContents);
	}

	private string listBoxContents; // Nowa zmienna składowa
} // Koniec ListBox

public class Button : Window
{
	public Button(
	   int top,
	   int left)
		: base(top, left)
	{ }

	// Trzeba przesłonić wersję klasy bazowej (słowo kluczowe), ponieważ 
	// metoda klasy pochodnej działa w inny sposób
	public override void DrawWindow()
	{
		Console.WriteLine("Rysowanie przycisku w punkcie {0}, {1}\n",
		   top, left);
	}
} // Koniec Button

public class Tester
{
	static void Main()
	{
		Window win = new Window(1, 2);
		ListBox lb = new ListBox(3, 4, "Samodzielna kontrolka klasy ListBox");
		Button b = new Button(5, 6);
		win.DrawWindow();
		lb.DrawWindow();
		b.DrawWindow();

		Window[] winArray = new Window[3];
		winArray[0] = new Window(1, 2);
		winArray[1] = new ListBox(3, 4, "Kontrolka klasy ListBox w tablicy");
		winArray[2] = new Button(5, 6);

		for (int i = 0; i < 3; i++)
		{
			winArray[i].DrawWindow();
		} // Koniec for
	} // Koniec Main
} // Koniec Tester
