Subscribe
od početnika do znalca

Apstrakcija (interfejsi i apstraktni tipovi)

Šta je interfejs u objektno orjentisanim jezicima ?

Intefejs je apstraktni tip, koji ne sadrži podatke, već metode koje će klasa implementirati.
Interfejs sadrži isključivo abstraktne članice i one mogu biti događaji, indekseri, metode ili svojstva.Svaka gore navedena članica implicitno ima public pristup i njega nije moguće menjati.Interfejs može naslediti više interfejsa, što nije slučaj sa klasama koje mogu naslediti isključivo jednu klasu, ali mogu implementirati više interfejsa.
Svaka konkretna klasa koja implemetnira interfejs, mora implementirati sve članice, međutim apstraktna
klasa može implementirati neke članice, dok one, koje se ne implementiraju potrebno je postaviti da su apstraktne. Ukoliko želimo da implementiramo podrazumevajuće ponašanje, a ipak dozvolimo drugim programerima da implementiraju drugačije ponašanje postavićemo rezervisanu reč virtual.
Evo primera:

public interface IOsnovniEntitet
{
   int Id {get;set;}
}
public interface IZaposlen : IOsnovniEntitet
{
 void DodeliRadnoMesto (DateTime datumPocetkaRada, RadnoMesto novoRadnoMesto);
}
public Zaposlen : IZaposlen 
{
   public void DodeliRadnoMesto (DateTime datumPocetkaRada, RadnoMesto novoRadnoMesto)
   { // implementacija dodele radnog mesta  }
}

public interface IOsnovnoSredstvo : IOsnovniEntitet 
{
  void ZaduziSredstvo (DateTime datumZaduzenja, IZaposlen zaposlenZaduzio);
  void RazduziSredstvo (DateTime datumRazduzenja);
  void OtpisiSredstvo (int sredstvoId);
}

public abstract OsnovnoSredstvo : IOsnovnoSredstvo
{
  public void ZaduziSredstvo (DateTime datumZaduzenja, IZaposlen zaposlenZaduzio)
  { // podrazumevana implementacija }

  public void RazduziSredstvo (DateTime datumRazduzenja)
  {}
  
  public abstract void OtpisiSredstvo(int sredstvoId);
}

public class Laptop : OsnovnoSredstvo
{
    public void OtpisiSredstvo(int sredstvoId)
    { // implementacija za otpis sredstva specificno za Laptop }
}

public class Vozilo : OsnovnoSredstvo
{
  public void OtpisiSredstvo(int sredstvoId)
  { // implementacija za otpis sredstva specificno za Vozilo }
}

U gore datom primeru vidimo da Vozilo i Laptop mogu implementirati specifičnosti ponašanja (tj. metoda).Kod apstraktnih klasa situacija je nešto drugačija. Apstraktna klasa najčešće se koristi u scenarijima kada postoji podrazumevano ponašanje koje implementiramo, dok se izvedenoj klasi omogućava implementacija pojedinih metoda

Primer:

public abstract class DataExport
{
  protected abstract void IzvrsiExport(string sadrzaj);
  protected virtual bool OtvoriFajl(string nazivFajl);      // otvoriti fajl
}

protected virtual void ZatvoriFajl(string nazivFajla) 
{ // zatvoriti fajl. }

public bool Exportuj(string nazivFajl, string sadrzaj)
{
  bool fajl_uspesno_otvoren = OtvoriFajl(nazivFajl);
  if (fajl_uspesno_otvoren)
  {
      IzvrsiExport(sadrzaj);
  }
  ZatvoriFajl(nazivFajla); 
}<br />
public class ExcelExport : DataExport
{
    protected override void IzvrsiExport(string nazivFajla)
    {
        Console.WriteLine("Excel export");
    }
}

public class XmlExport : DataExport
{
   protected override void IzvrsiExport(string nazivFajla)
   {
      Console.WriteLine("Eksport u XML fajl");
   }
}

U prethodnom primeru mogli smo da vidimo kako metodu IzvrsiExport implementiraju
konkretne klase ExcelExport i XmlExport i na taj način omogućavaju drugačije
ponašanje sistema.
Ono što bismo naglasili jeste da apstraktna klasa ne može imati instancu, tj. sledeće nije dozvoljeno:

OsnovnoSredstvo s = new OsnovnoSredstvo();

međutim sledeća linija koda jeste dozvoljena jer Vozilo nasleđuje OsnovnoSredstvo koje implementira IOsnovnoSredstvo:

 
IOsnovnoSredstvo osnovno_sredstvo = new Vozilo();

Predlozi u imenovanju interfejsa i apstraktnih klasa:

  1. naziv interfejsa počinje sa I npr, IOsnovnoSredstvo
  2. kada se jednom definiše interfejs, potpis metoda ne treba menjati
  3. ako je ipak potrebna promena interfejsa na bilo koji način, predlog je da se kreira novi interfejs
  4. apstraktne klase treba koristiti u scenarijima kada se očekuje verzionisanje jer je dodavanje nove funkcionalnosti olakšano činjenicom da je moguće dodati metodu u izvedenoj klasi a da pri tome nije potrebno menjati klijentski kod (tj. klase koje su već izvedene iz osnovne)

S

  • Snippets u Visual Studio-u – šta su i kako da…

    Šta su snippeti i čemu služe? Kako da kreiramo naš snippet i budemo produktivniji?

     

  • Builder dizajn patern

    Builder patern – šta je i kako se implementira kroz primer.

     

  • Konstruktor (podrazumevajući i parametrizovani)
    Šta je interfejs u objektno orjentisanim jezicima ? Intefejs je apstraktni tip, koji ne sadrži podatke, već metode koje će klasa implementirati. Interfejs sadrži isključivo abstraktne članice i one mogu biti događaji, indekseri, metode ili svojstva.Svaka gore navedena članica implicitno ima public pristup i njega nije moguće […]

     

  • Poslovna aplikacija – odakle početi ?
    Šta je interfejs u objektno orjentisanim jezicima ? Intefejs je apstraktni tip, koji ne sadrži podatke, već metode koje će klasa implementirati. Interfejs sadrži isključivo abstraktne članice i one mogu biti događaji, indekseri, metode ili svojstva.Svaka gore navedena članica implicitno ima public pristup i njega nije moguće […]

     

Leave a Reply