8 zestawow pytan opisowych, wwsi, III semestr


JiPP

pytania opisowe z przykladami kodu

  1. Wyjaśnić mechanizm „polimorfizmu metod” podając: istotę problemu, zasady definiowania i wywoływania takich metod.

  2. Zilustrować odpowiedź przykładami kodu w C#.

  3. 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:

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:

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:

  1. Podać i krótko wyjaśnić zasadnicze cechy programowania obiektowego

  2. Zilustrować odpowiedź przykładami kodu w C#

  3. Czym różni się „przeciążanie metod” od „poliformizmu metod”

Odpowiedzi

1A)

Podstawowe cechy OOP:

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]:

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:

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:

  1. Czym różni się pamięć „dispose” od „using” programu?

  2. Zilustrować odpowiedź przykładami kodu w C#.

  3. 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 ?

  4. 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();

}

  1. Podać i krótko opisać zasady korzystania z istniejących atrybutów i definiowania własnych atrybutów przez programistę w środowisku C#.Net.

  2. 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:

Tworzenie własnego atrybutu:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)]

public class MojAtrybut: System.Attribute

{...}

[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]

  1. Podać i krótko wyjaśnić zasadnicze cechy programowania obiektowego

  2. Zilustrować odpowiedź przykładami kodu w C#

  1. Wyjaśnić mechanizm obsługi sytuacji wyjątkowych

  2. 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;

}

}

}

  1. Podać i krótko opisać sposoby przekazywania argumentów w wywołaniach metod i role pełnione przez te argumenty w C#

  2. Zilustrować odpowiednimi przykładami kodu C#

w wywołaniach metod:

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

}

Przykład (paramert wyjściowy „out”):

static void OutDemo(out int p)

{

// …

}

int n;

OutDemo(out n);

  1. Wyjaśnić znaczenie interface, object, is, as i podać ich przykłady w kodzie

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( );

}

Klasa Object posiada metody dziedziczone przez wszystkie klasy:

Punkt p = new Punkt();

Console.WriteLine(p.ToString()); // Wyprowadzi napis: „Punkt”

Metody klasy String:



Wyszukiwarka