Szablony klas

Stronę tą wyświetlono już: 233 razy

Wstęp

Szablony są niezwykle ważnym elementem programowania, umożliwiają one dynamiczne dostosowanie kodu klasy do naszych potrzeb, a to dynamiczne dostosowanie wykonywane jest w trakcie jego kompilacji. Umożliwiają one opisanie za pomocą jednego kodu klas, czy metod klas, które będą się różniły jedynie typem danych w nich zawartych.

Przykład implementacji szablonu klasy

Przykład implementacji klasy szablonowej:

Listing 1
  1. // ######################### SZABLON KLASY ########################
  2. class point<T> where T : struct/*, class, IComparable, IConvertible*/
  3. {
  4. protected T x;
  5. public T X
  6. {
  7. get { return x; }
  8. set { x = value; }
  9. }
  10. protected T y;
  11. public T Y
  12. {
  13. get { return y; }
  14. set { y = value; }
  15. }
  16. public point(T x, T y)
  17. {
  18. this.x = x;
  19. this.y = y;
  20. }
  21. public override string ToString()
  22. {
  23. return "point: x = " + x + "; y = " + y;
  24. }
  25. }

Jak widać w C# nie jest konieczne użycie słowa kluczowego template tak jak to miało miejsce w przypadku C++, wystarczy bowiem podać po słowie kluczowym class listę typów używanych w klasie, po czym możliwe jest jeszcze zdefiniowanie dodatkowych warunków, jakie dane typy muszą spełniać. W powyższym przykładzie zaznaczono, że T musi być typu wartościowego (czyli strukturą). można też wyszczególnić interfejsy, po których dana klasa musi dziedziczyć. I tutaj warto wyróżnić dwa typy interfejsów: IComparable i IConvertible. Jeżeli chcesz zaznaczyć, że dany typ musi wykorzystywać operatory porównania, to musisz do listy warunków dodać właśnie interfejs IComparable, natomiast gdy chcesz, aby dany typ obsługiwał metody związane z konwersją na typy proste, musisz dodać dziedziczenie po interfejsie IConvertible.

Można też wymusić, aby podany typ obsługiwał konstruktor bezparametrowy w następujący sposób:

Listing 2
  1. class point<T> where T: class, new(){
  2. ...
  3. }

Można też wymusić dziedziczenie jednego typu po drugim:

Listing 3
  1. class point<T, A> where T: A, new(){
  2. ...
  3. }

Komentarze