Rozważmy prosty kod C#, którego celem jest wyświetlanie danych, zależnych od słowa-klucza. Niech kluczem będzie nazwa jaką zapiszemy w zmiennej typu string:
String name;
Niech to będzie kilka imion np
Jan,Marta,Filip.
Zależnie od zawartości zmiennej wywoływana ma być odpowiednia metoda wyświetlającą szczegóły.
Zadanie banalne, najprościej napisać kilka warunków w celu realizacji tego co chcemy:
Show show= new Show();
If (name == „Jan”)
{
show.Jan()
}
Else if(name ==„Marta”)
{
show.Marta()
}
Else if(name==„Filip”)
{
show.Filip()
}
Jak widać sprawdzamy zawartość zmiennej name i dla każdej możliwości wywołujemy metodę obiektu klasy Show. Wyglada ona w tym wypadku tak:
Class Show
{
public Filip()
{
Console.WriteLine(„dane Filipa”);
}
public Marta()
{
Console.WriteLine(„dane Marty”);
}
public Jan()
{
Console.WriteLine(„dane Jana”);
}
}
Wszystko działa i z pozoru nie ma nad czym deliberować. Co jednak jeśli przybędzie nam imion i danych? Dodanie 100 nazw spowoduje konieczność dodania 100 warunków w naszym kodzie, co nie będzie wyglądało zbyt elegancko, ani czytelnie. Można by zamiast if i else if użyć switch i case, ale niewiele to w tym wypadku zmienia. Co jeszcze wiec można zrobić? Użyć słownika!
W naszym wypadku kluczem w słowniku będzie napis string. Chcemy aby klucz o wybranej nazwie umożliwiał wywołanie odpowiadającej mu metody obiektu show. W związku z tym wygodnie będzie, aby wartością wskazywaną przez klucz typu string w naszym słowniku był interfejs, zawierający metodę Show().
Dictionary <string,IDataShowable> dataDict;
Dla wygody wyciągnijmy sobie ten słownik do innej klasy o nazwie Dict:
Dict dict = new Dict();
dict.dataDict["Jan"].Show();
Teraz możemy wywoływać metodę odpowiadającą danemu name, bez użycia warunków. W przypadku nowych nazw, wystarczy dodać do naszego słownika odpowiednie klucze i wskazać odpowiednie klasy implementujące nasz interfejs IDataShowable.
A oto nasz interfejs:
Interface IDataShowable
{
void Show();
}
Teraz,mając interfejs wystarczy dla wybranego name stworzyć sobie klasę, jaka go implementuje, a w metodzie Show() takiej klasy, pokazać szczegóły w dowolny dla danego wyboru sposób. Dla Jana np niech zaśpiewa, dla Marty wyświetli a dla Filipa wydrukuje...kwestia inwencji;)
Jak widać, warto korzystać z dobrodziejstw płynących z użycia słowników(i interfejsów rzecz jasna też).
Poniżej kompletny kod C# omawianego zagadnienia. Zachęcam do jego analizy:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace UseDict
{
class Program
{
static void Main(string[] args)
{
Dict dict = new Dict();
dict.dataDict["Jan"].Show();
}
}
class Dict
{
public Dictionary<string,IDataShowable> dataDict;
public Dict()
{
dataDict = new Dictionary<string,IDataShowable>()
{
{"Jan",new Jan()},
{"Marta",new Marta()},
{"Filip",new Filip()}
};
}
}
interface IDataShowable
{
void Show();
}
class Filip: IDataShowable
{
public void Show()
{
Console.WriteLine("dane Filipa");
}
}
class Marta: IDataShowable
{
public void Show()
{
Console.WriteLine("dane Marty");
}
}
class Jan:IDataShowable
{
public void Show()
{
Console.WriteLine("dane Jana");
}
}
}
Życzę wszystkim powodzenia!:)