JiPP
pytania opisowe z przykladami kodu
Wyjaśnić mechanizm „polimorfizmu metod” podając: istotę problemu, zasady definiowania i wywoływania takich metod.
Zilustrować odpowiedź przykładami kodu w C#.
Czym różni się pamięć „stosu danych” od pamięci „sterty danych” programu ?
Odpowiedzi
1A)
Istotą polimorfizmu metod jest możliwość dokonania wyboru metody, która ma zostać uruchomiona dopiero w trakcie wykonania programu. Definiowanie polimorfizmu polega na:
zdefiniowaniu w klasie bazowej metody wirtualnej
nadpisaniu tej metody w klasach dziedziczących z klasy bazowej.
Wywoływanie: w trakcie działania programu, zależnie od tego jakiej klasy jest obiekt zostanie wywołana odpowiednia metoda.
Wykorzystywany jest w dziedziczeniu. Podczas dziedziczenia jedne metody mogą być
dziedziczone przez klasę pochodną, a inne mogą być zastępowane nowymi w klasie pochodnej, używa się wtedy przed nazwą metody słowa „override” w klasie podstawowej przed taką metodą umieszcza się słowo „virtula".
1B)
Definiujemy klasę bazową :
class Figura{
public virtual float ObliczPole(){}
}
Definiujemy klasy dziedziczące:
class Kwadrat:Figura{
private int bok;
private override float ObliczPole(){
return bok*bok;
}
}
class Kolo:Figura{
private int promien;
private override float ObliczPole(){
return 3.1415*promien*promien;
}
}
1C)
Stos - wykorzystywany jest do typów bezpośrednich takich jak: int, float. Operacje na zmiennych są przeprowadzane na kopi zmiennej, a nie na oryginale. Przydział pamięci metodą FIFO ,przechowuje:
wywołania (rekordy aktywacji) podprogramów (procedur, funkcji, metod) i definicje zmiennych globalnych (o ustalonej w czasie kompilacji strukturze)
Sterta - wykorzystywany jest do typów referencyjnych takich jak: class, struct. Operacje na zmiennych są przeprowadzane na oryginale, a nie na kopi zmiennej. Przydział pamięci metodą dynamiczną. ,przechowuje:
dane o zmiennej długości(zwykle istnieje operator „new”)
Podać i krótko wyjaśnić zasadnicze cechy programowania obiektowego
Zilustrować odpowiedź przykładami kodu w C#
Czym różni się „przeciążanie metod” od „poliformizmu metod”
Odpowiedzi
1A)
Podstawowe cechy OOP:
Abstrakcyjne typy danych (klasy: figura, kwadrat i koło), może zawierać zmiene składowe i metody składowe
dziedziczenia cech (klasy pochodne) (klasy kwadrat i koło dziedziczą z klasy figura)
wielopostaciowości (polimorfizmu) obiektów i operacji (metoda oblicz pole jest polimorficzna)
ukrywania szczegółów (kapsułkowanie, hermetyzacja) (dostęp do pola bok przez metodę UstawDlugoscBoku)
Ułatwia „przekładanie” otaczający nas świat na język programowania.
1B)
class Figura{
public virtual float ObliczPole(){}
}
class Kwadrat:Figura{
private int bok;
public void UstawDlugoscBoku(int dl){
this.bok=dl;
}
public override float ObliczPole(){
return bok*bok;
}
}
class Kolo:Figura{
private int promien;
public override float ObliczPole(){
return 3.1415*promien*promien;
}
}
1C)
Przeciążanie metod polega na definiowaniu kilku metod (w jednej klasie) o tej samej nazwie różniących się liczbą i typem argumentów; mogą występować w obrębie np. klasy.
class Test {
void funk();
void funk(int i); //przeciążona metoda
}
Polimorfizm polega na wywołaniu odpowiedniej metody zależnie od typu obiektu (metody zdefiniowane w poszczególnych klasach)
Różnica - przeciążanie metod występuje w obrębie jakiejś klasy, a w poliformizmie metod, metody przeciążane są dopiero w momencie dziedziczenia; poliformizm jest bardziej „bezpieczny”, mniej podatny na błędy programisty, gdyż programista nie musi wiedzieć nic na temat funkcji, którą przeciąża.
[Poliformizm - szczegółowo]:
poliformizm (wielopostaciowość) - funkcja umożliwiająca redefinicje metody z klasy bazowej w klasie pochodnej.
Metoda wirtualna i jej nadpisanie -przykład:
class Token // Klasa bazowa
{ …
public virtual string Name( ){...} // Metoda wirtualna
}
class CommentToken: Token // Klasa pochodna
{ …
public override string Name( ){...} // Nadpisanie
}
Warunki:
deklaracje obu metod muszą być identyczne (ten sam dostęp, typ wyniku, nazwa i lista parametrów)
metody nadpisanej nie można jawnie deklarować jako wirtualnej
metoda nadpisana nie może być statyczna ani prywatna
Ukrywanie metody dziedziczonej - przykład:
class Token
{ …
public int LineNumber( ){...} // Metoda w klasie
// bazowej. Metoda jest zwykła (ale mogłaby być wirtualna).
}
class CommentToken: Token
{ …
new public int LineNumber( ){...} // Nowa metoda
// ukrywająca metodę dziedziczoną o identycznej sygnaturze.
}
Warunki:
nowa i ukrywana metoda muszą mieć identyczną sygnature (nazwę i listę parametrów)
można ukrywać dziedziczone pola i klasy zagnieżdżone
Czym różni się pamięć „dispose” od „using” programu?
Zilustrować odpowiedź przykładami kodu w C#.
Podać i krótko wyjaśnić pojęcie klas specjalnych: jakie są te klasy, jak definiujemy i korzystamy z nich? Na czym polega różnica pomiędzy Object a int ?
Zilustrować odpowiedz przykładami kodu w C#]
Funkcja Dispose służy do zwalniania zasobów w środowisku z zarządzaną pamięcią i jest definiowana przez interfejs IDisposable. Metoda ta nie jest automatycznie wywoływana przez destruktor obiektu więc jej implementacja leży w gesti programisty.
klasa obiekt = new klasa ()
(...)
finally {
if (obiekt != null) ((IDisposable)obiekt).Dispose( );
}
Instrukcja using jest mechanizmem automatycznego zwalniania (czyli wywołania metody Dispose) dla krótkotrwałego kożystania z zasobu programu.
Metoda Dispose jest automatycznie wywoływana na końcu bloku using.
using (klasa obiekt = new klasa ())
{
obiekt.metoda();
}
Podać i krótko opisać zasady korzystania z istniejących atrybutów i definiowania własnych atrybutów przez programistę w środowisku C#.Net.
Zilustrować odpowiedź przykładami kodu w C#.
Atrybuty - to Znaczniki o charakterze deklaracyjnym zawierające informację o elementach programu (np. klasach, typach wyliczeniowych, zestawach) przeznaczoną dla
środowiska wykonania programu. Są pamiętane jako meta-dane elementu programu.
Predefiniowane atrybuty:
Conditional - wykorzystywany do debugowania - Powoduje warunkową kompilację wywołań metod, warunkowaną wartością nazwy w programie
DllImport - powoduje załadowanie zewnętrznej biblioteki DLL (kożysta z usługi Platform Invocation Services)
ComImport - dla współpracy z COM
Transaction - dla protokołów tranzakcji (COM+)
Tworzenie własnego atrybutu:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)]
public class MojAtrybut: System.Attribute
{...}
AttributeUsage - określa zasięg atrybutu
dla wielu elementów atrybutu stosujemy operator alternatywy bitowej lub logicznej „|”
można stworzyć klasę atrybutu, ale musi ona dziedziczyć z klasy System.Attribute (bezpośrednio lub pośrednio)
aby element mógł posiadać wiele instancji tego samego atrybutu należy ustawić parametr „AllowMultiple = true” dla atrybutu AttributeUsage.
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
Podać i krótko wyjaśnić zasadnicze cechy programowania obiektowego
Zilustrować odpowiedź przykładami kodu w C#
posługiwanie się abstrakcyjnymi typami danych -
klasa (element składni języka opatrzony nazwą, implementujący abstrakcyjny typ danych - wyznacza pewną strukturę (agregację) danych i jej możliwe zachowanie (operacje))
i jej obiekty - czyli instancje klasy (jej zmienne)
mechanizm dziedziczenia - możliwość tworzenia nowych, bardziej złożonych obiektów na bazie już istniejących (klasy pochodne)
enkapsulacja (kapsułkowanie, hermetyzacja, kontrola dostępu, ukrywanie informacji) - jest to jedno z założeń paradygmatu programowania obiektowego polegającego na ukrywaniu pewnych danych składowych lub metod tak aby były dostępne tylko w ramach danej klasy ewentualnie funkcjom pochodnym lub zaprzyjaźnionym. Realizowana jest za pomocą kwalifikatorów dostępu:
public - klasa lub składowa dostępna dla wszystkich
protected - dostęp tylko w swojej klasie i klasach pochodnych
private - dostęp tylko w ramach swojej klasy
internal - dostęp w ramach zestawu (assembly), do którego należy
protected internal - dostęp w ramach zestawu lub z klas dziedziczonych z klasy do której składowa należy
Wyjaśnić mechanizm obsługi sytuacji wyjątkowych
Odpowiedź zilustrować przykładami kodu w C#.
Odpowiedzi:
A) Obsługa sytuacji wyjątkowych w C# ma charakter obiektowy i polega na zagnieżdżeniu kodu programu, dla którego ma być uaktywniony określony wyjątek wewnątrz bloku try.
Sama obsługa błedów odbywa się w bloku catch. Po tym slowie w nawiasach umieszczana jest deklaracja identyfikująca typ wyjątku na jaki ma zareagować obsługa wyjątku, a blok zawiera procedurę.
public class MojaKlasa {
JakasKlasa obiekt = new JakasKlasa;
void metodaMojejKlasy() {
try {
obiekt.metoda(int zmienna);
}
catch(Exception e) {
Finalize obiekt.metoda2;
}
}
}
Podać i krótko opisać sposoby przekazywania argumentów w wywołaniach metod i role pełnione przez te argumenty w C#
Zilustrować odpowiednimi przykładami kodu C#
Przekazywanie argumentów:
3 rodzaje argumentów:
in
out - (do wywołania metody nie musi być przekazywana zainicjowana (posiadająca wartość) zmienna, bo poprzez taki parametr przekazywana jest jedynie wartość zwrotna, ustalona w wykonaniu metody - przykład poniżej)
in/out
2 sposoby przekazywania:
przez wartość (przykład poniżej)
przez referencję (używa się słowa „ref” w deklaracji i wywołaniu metody. Przekazywane jest odniesienie (ukryty adres) do miejsca w pamięci, w którym zaalokowano wartość zmiennej)
w wywołaniach metod:
przez wartość (tylko argument wejściowy) - „in”
przez referencję (argumenty wejściowy i wyjściowy) - „in” i „out”
przez referencję (argument wyjściowy) - „out”
Przydład (przez wartość):
static void AddOne(int x)
{
x++; // Inkrementuj x
}
static void Main( )
{
int k = 6;
AddOne(k);
Console.WriteLine(k); // Wyświetli 6 a nie 7
}
sd
Przykład (paramert wyjściowy „out”):
static void OutDemo(out int p)
{
// …
}
int n;
OutDemo(out n);
Wyjaśnić znaczenie interface, object, is, as i podać ich przykłady w kodzie
Interface - to abstrakcyjna reprezentacja klasy pozwalająca na kożystanie z niej niezależnie od jej faktycznej implementacji. Interfejs pozwala na enkapsulację wielu różnych obiektów utworzonych w oparciu o odmienne klasy, które zawierają implementację wspólnego interfejsu.
Interfejs zawiera jedynie deklarację operacji bez ich definicji, może zawierać deklaracje własności i definicje stałych.
Przykład:
interface Itoken
{
int LineNumber( );
string Name( );
}
Nazwa zaczyna się od duże litery „I” (konwencja)
brak treści definicji metod
brak specyfikacji trybu dostępu
klasa może implementować 0 lub wiele interfejsów
interfejs może dziedziczyć po innych interfejsach (w tym po wielu na raz)
klasa może mieć szerszy dostęp niż jej bazowe interfejsy
interfejs nie może być szerzej dostępny niż jego bazowe interfejsy
klasa „Object” / typ „object”:
typ „object” jest synonimem klasy „System.Object” - jest to bazowa klasa wszystkich klas języka C#.
Wszystkie klasy dziedziczą (jawnie lub nie) klasę Object.
Klasa Object posiada metody dziedziczone przez wszystkie klasy:
ToString - konwersja obiektu na string (domyślna definicja w klasie Object zwraca nazwę typu tego obiektu:
Punkt p = new Punkt();
Console.WriteLine(p.ToString()); // Wyprowadzi napis: „Punkt”
Equals - porównuje dwie referencje do obiektów
GetType - podaje typ
Finalize - wyznacza metodę, która zostanie wykonana jako ostatnia przed usunięciem obiektu
Klasa „String” / typ „string” :
typ „string” jest synonimem klasy „System.String” - przeznaczony do reprezentacji sekwencji napisów (Unicode) i reprezentuje niemodyfikowalne napisy.
Do modyfikacji używana jest klasa „StringBuilder” (zmienia i zapisuje na typ „string”)
Metody klasy String:
Indeksowanie
„Insert” - wstawianie
Własność „Length” - wypisuje ilość znaków
„Copy” - kopiowanie
„Concat” - łączenie stringów
„Trim” - usuwa poprzedzające i kończące spacje
„ToUpper”, „ToLower” - zmiana na duze / małe litery
„Equals” - sprawdzenie równoważności
„Compare” - porównanie leksykograficzne (pomija wielkość liter)