Transcript Wykład 3

Wydział Elektroniki
Kierunek: AiR
Zaawansowane metody programowania
Wykład 3
Język C#
Tablice
• Tablica jest zbiorem danych, do których można się odwołać poprzez indeksy
numeryczne.
• Typ tablicowy jest typem referencyjnym. Rzeczywiste instancje są tworzone
dynamicznie za pomocą operatora new
• Operator new określa długość tablicy Lenght
• Indeksy elementów jak w C i C++
• Elementy tablicy są automatycznie inicjowane na wartości domyślne (zero
lub null)
• Tablica jednowymiarowa: int [] a1 = new int[10];
• Tablica dwuwymiarowa: int [,] a2 = new int[10,5];
• Tablica trójwymiarowa: int [,,] a3 = new int[10,5,2];
• Tablica postrzępiona (nieregularna):
int [][] b = new int[3][];
b[0] = new int[10];
int[] t = new int [3];
b[1] = new int[5];
t[0] =2;
b[2] = new int[20];
t[1] =3;
• Inicjalizacja tablicy – lista wyrażeń zawarta między
nawiasami klamrowymi: int [] aa = new int[] {2,3,4}; t[2] =4;
• Rozmiar tablicy określa liczba wyrażeń
int [] aa = t;
Język C#
Parametry typu
• Definicja klasy może określać zbiór
public class Pair <TFirst, TSecond>
parametrów typu. Ich listę nazw
umieszcza się w nawiasach trójkątnych {
bezpośrednio po nazwie klasy.
public TFirst First;
• Parametry typu mogą być później
public TSecond Second;
wykorzystywane w ciele deklaracji
}
klasy w celu zdefiniowania jej
składowych.
• Klasa zadeklarowana w taki sposób, aby korzystać z parametrów typowych
nosi nazwę klasy ogólnej (generic), klasy generycznej lub klasy
uniwersalnej.
• Gdy klasa ogólna jest używana, odpowiednie argumenty typu muszą być
podane dla każdego z parametrów typu.
• Typ ogólny z podanymi argumentami typu nosi nawę typu skonstruowanego.
Pair <int,string> Ala = new Pair <int,string> {First=1;
Second = ”dwa”};
int i = Ala.First;
string s = Ala.Second;
Język C#
Klasy bazowe
•
•
•
•
•
Deklaracja klasy może określać
klasę bazową, której nazwa
pojawia się po nazwie klasy
deklarowanej, parametrach
typu i dwukropku. Pominięcie
klasy bazowej oznacza
dziedziczenie po typie object.
Klasa dziedziczy składowe po
swojej klasie bazowej.
Klasa zawiera wszystkie
składowe należące do klasy
bazowej z wyjątkiem jej
konstruktorów.
Klasa potomna może dodawać
nowe składowe do tych, które
odziedziczyła, nie może jednak
w żaden sposób usuwać
odziedziczonych składowych.
Każda klasa może być
domyślnie konwertowana na
typ dowolnej ze swoich klas
bazowych.
public class Point {
public int x, y;
public Point(int x, int y) {
this.x = x;
this.y = y;}
}
public class Point3D: Point {
public int z;
public Point3D(int x, int y, int z): base(x, y)
{
this.z = z;
}
}
Point a = new Point(10, 20);
Point b = new Point3D(10, 20, 30);
Język C#
Metody
•
•
•
•
•
•
Metoda to składowa klasy,
implementująca obliczanie lub
działanie. Może być wykonana przez
obiekt lub klasę.
Metody statyczne i metody instancji.
Metody mają listy parametrów (mogą
być puste) i mogą zwracać jakąś
wartość (może być void).
class Test {
static void Swap(ref int x, ref int y) {
int temp = x;
x = y;
y = temp;}
static void Main() {
int i = 1, j = 2;
Swap(ref i, ref j); // zamiana!!
Parametry mogą być wartościowe
lub referencyjne. Argument
}
class
Test
{
przekazywany w postaci
}
static void Divide(int x, int y, out int rt, out int rm) {
parametru referencyjnego
musi być zmienną.
rt = x/y;
Parametr referencyjny jest
rm = x%y; }
deklarowany
static void Main() {
z modyfikatorem ref.
int result, reminder;
Parametr wyjściowy
Divide(10,3, out result, out reminder); // 3 1
jest deklarowany
}}
z modyfikatorem out.
Język C#
Metody wirtualne, przesłaniające i abstrakcyjne
•
•
•
•
Gdy deklaracja metody zawiera
modyfikator virtual to taka metoda
jest metodą wirtualną.
Metoda wirtualna może zostać
przesłonięta w klasie potomnej.
Metoda instancji w klasie potomnej
zawierająca modyfikator override
przesłania odziedziczoną metodę
wirtualną.
Metoda abstrakcyjna jest metodą
wirtualną pozbawioną implementacji.
Deklaracja tej metody wymaga użycia
słowa kluczowego abstract i jest
możliwa tylko w klasie również
zadeklarowanej z użyciem tego
samego słowa.
Metoda abstrakcyjna musi być
przesłonięta w każdej nieabstrakcyjnej
klasie potomnej.
public abstract class Ala
{
………………..
public abstract int IIAR(void);
}
………………………………………………
public class Ela: Ala
{
……………………..
public override int IIAR(void)
{
Console.Writeline(”Ala ma kota”);
}
}
Język C#
Przeładowywanie (przeciążanie) metod
• Przeładowywanie metod umożliwia class Test {
wielu metodom z tej samej klasy
static void F() {
posiadanie tej samej nazwy pod
Console.Writeline(”F()”);}
warunkiem, że maja one różne
static void F(object x) {
sygnatury.
Console.Writeline(”F(object)”);}
• Wybór metody następuje w trakcie
static void F(int x) {
kompilacji.
Console.Writeline(”F(int)”);}
• Idea: kompilator wyszukuje metodę,
static void F(int x, int y) {
która najlepiej pasuje do
Console.Writeline(”F(int,int)”);}
argumentów, lub zgłasza błąd, gdy
static void Main() {
nie może znaleźć sensownego
F();
// F()
dopasowania.
F(1);
// F(int)
• Przykład z C++ - klasa Complex
F(”Ala”); // F(object)
• Zadanie do domu: przerobić na C#.
F(1,2);
}
}
// F(int,int)