Wyższa Szkoła Techniczno – Ekonomiczna w Świdnicy
2016-11-17 Metody programowania – 1 W5 1
Metody programowania – 1 dr inż. Tadeusz Jeleniewski
Jeszcze o klasach i obiektach - Modyfikatory parametrów w metodach - Parametry linii poleceń
- Interfejsy
- Klasy uniwersalne - Indeksatory
- Delegaty
Modyfikatory parametrów w metodach
Parametry metod mogą, oprócz atrybutu typu posiadać modyfikatory.
Rozważmy przykład prostej metody:
public static int Dodaj(int x, int y) {
int wynik = x + y;
x = 1999;
y = 2834;
return wynik;
}
Domyślnie parametry są przekazywane do metod przez wartość.
W powyższym przykładzie użytkownik wywołujący metodę Dodaj nie zobaczy
zmienionych wartości zmiennych wstawionych w momencie wywoływania za x i y.
W celu umożliwienia odzyskania zmienionych wartości parametrów metod poza ich zasięgiem w C# znalazły się pewne słowa kluczowe pełniące rolę modyfikatorów.
Pokazano je w tabeli 5.1.
Wyższa Szkoła Techniczno – Ekonomiczna w Świdnicy
2016-11-17 Metody programowania – 1 W5 3
Metody programowania – 1 dr inż. Tadeusz Jeleniewski
Przykład użycia słowa kluczowego out
public static void dodaj(int x, int y, out int w) {
w = x + y;
}
Wywołanie tej metody wymaga również użycia słowa kluczowego out przed argumentem, np.
dodaj(32, 16, out wynik);
Modyfikator parametru Opis
brak modyfikatora Parametr wejściowy przekazywany przez wartość
out Parametrom wejściowym wywołana metoda przypisuje wartości
ref Wartość jest nadawana parametrowi przez tego, kto wywołał metodę, podczas działania metody wartość ta może być zmieniona.
params Umożliwia wysyłanie zmiennej liczby parametrów jako jednego parametru.
Metoda może mieć tylko jeden taki modyfikator i musi to być ostatni parametr metody.
Tabela 5.1. Modyfikatory parametrów metod
Parametry referencyjne (poprzedzane słowem kluczowym ref) stosuje się jeżeli metoda ma wykonać działanie, które zmieni wartości parametrów.
Różnice pomiędzy parametrami wyjściowymi a referencyjnymi :
• parametrów wyjściowych nie trzeba inicjować przed ich przekazaniem do metody wywoływanej
• parametry przekazywane przez referencję należy bezwzględnie zainicjować przed wysłaniem do metody wywoływanej. Przekazuje się w ten sposób wskaźnik na istniejący obiekt określonego typu.
Modyfikator params umożliwia przekazanie zmiennej liczby parametrów jako
jednego parametru.
Wyższa Szkoła Techniczno – Ekonomiczna w Świdnicy
2016-11-17 Metody programowania – 1 W5 5
Metody programowania – 1 dr inż. Tadeusz Jeleniewski
Przykład użycia słowa kluczowego params:
public void TablicaLiczb(string msg, params int[] lista) {
Console.WriteLine(msg);
for (int i = 0; i < lista.Length; i++) Console.WriteLine(lista[i]);
}
a powyższą metodę można wywołać na wiele różnych sposobów, np.:
int[] tablica = new int[3]{1, 2, 3};
lub
m.TablicaLiczb("Tutaj jest tablica liczb", tablica);
lub
m.TablicaLiczb("I jeszcze więcej", 54, 189, -11, 333, 27);
Wyższa Szkoła Techniczno – Ekonomiczna w Świdnicy
2016-11-17 Metody programowania – 1 W5 7
Metody programowania – 1 dr inż. Tadeusz Jeleniewski
Parametry linii poleceń
Parametry linii poleceń są przechowywane w tablicy łańcuchów umieszczonej w sygnaturze metody Main.
Sposób ich odzyskiwania pokazano na listingu 5.2.
Innym, alternatywnym sposobem jest użycie statycznej metody GetCommandLineArgs z klasy System.Environment.
Zwraca ona tablicę łańcuchów znaków, w której pierwszym elementem jest pełna
ścieżka dostępu do pliku zawierającego aplikację, a kolejnymi elementami są parametry
pobrane z linii poleceń.
Wyższa Szkoła Techniczno – Ekonomiczna w Świdnicy
2016-11-17 Metody programowania – 1 W5 9
Metody programowania – 1 dr inż. Tadeusz Jeleniewski
Wyższa Szkoła Techniczno – Ekonomiczna w Świdnicy
2016-11-17 Metody programowania – 1 W5 11
Metody programowania – 1 dr inż. Tadeusz Jeleniewski
Interfejsy
Interfejs jest pewnego rodzaju kontraktem, który gwarantuje, że klasa lub struktura obsługuje określone zachowania.
Kiedy definiuje się interfejs, można definiować metody, właściwości, mechanizmy indeksujące lub zdarzenia, które klasa obsługująca dany interfejs musi udostępniać.
Istnieje pewne dość odległe podobieństwo interfejsów do klas abstrakcyjnych. Różnica pomiędzy nimi polega jednak na tym, że klasy abstrakcyjne służą jako klasy bazowe rodziny klas pochodnych, a interfejsy są przeznaczone do włączania w dowolne drzewa dziedziczenia.
Składnia definicji interfejsu ma postać ogólną:
[atrybuty][modyfikatory dostępu] interface nazwa_interfejsu [:lista bazowa]
{ ciało interfejsu }
Tradycyjnie nazwa interfejsu rozpoczyna się od wielkiej litery I.
Wyższa Szkoła Techniczno – Ekonomiczna w Świdnicy
2016-11-17 Metody programowania – 1 W5 13
Metody programowania – 1 dr inż. Tadeusz Jeleniewski
W przykładzie 5.3 zdefiniowano interfejs IShapeFunction, który zawiera sygnatury dwóch metod GetArea i ShowMe.
Klasy Circle i Rectangle "dziedziczące" ten interfejs muszą zawierać definicje
tych dwóch metod, oczywiście różne w obydwu przypadkach.
Wyższa Szkoła Techniczno – Ekonomiczna w Świdnicy
2016-11-17 Metody programowania – 1 W5 15
Metody programowania – 1 dr inż. Tadeusz Jeleniewski
Klasy uniwersalne
Deklaracja klasy może określać zbiór parametrów, których listę nazw umieszcza się w nawiasach
"trójkątnych" < >bezpośrednio po nazwie klasy.
Parametry te można później wykorzystać w ciele definicji klasy dla zdefiniowania składowych
[1]
Klasa zadeklarowana w sposób pokazany w przykładzie 5.4 nosi nazwę klasy ogólnej (klasy generycznej lub klasy uniwersalnej). Charakter ogólny mogą mieć również struktury interfejsy i delegaty.
[1] Hejlsberg A., Torgersen M., Wiltamuth S., Golde P.: Język C#. Programowanie. Wyd. Helion 2010
Wyższa Szkoła Techniczno – Ekonomiczna w Świdnicy
2016-11-17 Metody programowania – 1 W5 17
Metody programowania – 1 dr inż. Tadeusz Jeleniewski
Indeksatory
Mechanizm indeksowania to konstrukcja języka C#, która umożliwia dostęp do kolekcji klasy za pomocą zwykłej składni używanej w tablicach [ ]. Jest to pewnego rodzaju właściwość, zawiera akcesory get oraz set które pozwalają określić działanie.
Właściwość mechanizmu indeksowania wewnątrz klasy deklaruje się za pomocą składni:
typ this [typ argumentu] {get; set;}
Zwracany typ określa typ obiektu zwracanego przez mechanizm indeksowania, a typ argumentu określa rodzaj argumentów używanych jako indeks kolekcji zawierającej obiekty docelowe.
Jako typu wartości indeksu zwykle używa się liczb całkowitych, ale można użyć także innych typów, nawet łańcuchów znaków. Akcesory get i set określają sposób w jaki obiekt jest pobierany z kolekcji i jak można zmieniać jego wartość.
Sposób tworzenia indeksatorów i ich użycia pokazuje przykład 5.5.
Wyższa Szkoła Techniczno – Ekonomiczna w Świdnicy
2016-11-17 Metody programowania – 1 W5 19
Metody programowania – 1 dr inż. Tadeusz Jeleniewski
Wyższa Szkoła Techniczno – Ekonomiczna w Świdnicy
2016-11-17 Metody programowania – 1 W5 21
Metody programowania – 1 dr inż. Tadeusz Jeleniewski
W przykładzie 5.6 pokazano sposób wykorzystania klasy uniwersalnej, jej obiektów oraz mechanizmu indeksatora.
Wyższa Szkoła Techniczno – Ekonomiczna w Świdnicy
2016-11-17 Metody programowania – 1 W5 23
Metody programowania – 1 dr inż. Tadeusz Jeleniewski
Wyższa Szkoła Techniczno – Ekonomiczna w Świdnicy
2016-11-17 Metody programowania – 1 W5 25
Metody programowania – 1 dr inż. Tadeusz Jeleniewski
Delegaty
Analogia do wskaźników na funkcje w C++.
W przypadku zastosowania metod wirtualnych kompilator wstrzymuje podjęcie decyzji do jakiej klasy przypisać daną metodę.
Przypisanie to następuje dopiero w czasie działania programu – jest to zjawisko tzw. późnego wiązania.
Często decyzja o tym, jaką metodę wykonać zostaje podjęta w trakcie działania aplikacji, np. na podstawie warunków jakie spełniają przetwarzane dane.
W takim przypadku do wyboru odpowiedniej metody można zastosować instrukcję if lub switch.
Bardziej czytelnym sposobem w przypadku złożonych aplikacji jest użycie delegatów.
W dużym uproszczeniu – delegaty przechowują referencję (adres w pamięci) do określonych metod. Pozwalają zatem wykonać kod odpowiedniej metody.
Delegaty są w rzeczywistości nowymi typami danych. Można je zagnieżdżać w klasie lub deklarować poza nią. Przykład:
public delegate int Dummy(int x);
Delegaty nie posiadają implementacji, a jedynie sygnaturę (nagłówek) zakończoną znakiem średnika.
Wyższa Szkoła Techniczno – Ekonomiczna w Świdnicy
2016-11-17 Metody programowania – 1 W5 27
Metody programowania – 1 dr inż. Tadeusz Jeleniewski
Do łączenia delegatów wykorzystuje się dwuargumentowe operatory + oraz +=
Łączenie delegatów pokazuje przykład 5.8: