Clasa abstracta vs interfata

O clasa abstracta nu poate fi instantiata doar mostenita. O clasa abstracta poate fi complet partial sau deloc implementata (deci poate sa nu contine metode abstracte). Clasa care mosteneste o clasa abstracta trebui sa implementeze toate metodele abstracte ale clasei abstracte. O metoda abstracta este o metoda care nu este implementata si este declarata folosind cuvantule cheie ‘abstract’. Aceste metode sunt implicit virtuale in C#.

abstract class Shape{                 

                  public void PrintMessage(){

                        Console.WriteLine(“o metoda care nu e abstracta”);

                  }

                   public abstract void Area();

            }

class Circle :Shape{

                  public override void Area() {

                        Console.WriteLine(“o metoda abstracta”);

                  }

            }

 

Pentru a evita intr-o clasa implementarea unei metode abstracte din clasa abstracta mostenita clasa respectiva va fi declarata ca abstracta.

abstract class Shape{                 

                  public void PrintMessage(){

                        Console.WriteLine(“o metoda care nu e abstracta”);

                  }

                  public abstract void Area();

                  public abstract void Extent();

            }

      abstract class Circle :Shape{

                  public override void Area(){

                        Console.WriteLine(“o metoda abstracta”);

                  }

            }

 

In C# o clasa abstracta poate mosteni dintr-o clasa care nu e abstracta.

class Lines{

                  public void PrintLine(){

                        Console.WriteLine(“first we have a line”);

                  }

            }

      abstract class Shape :Lines{                 

                  public void PrintMessage(){

                        Console.WriteLine(“o metoda care nu e abstracta”);

                  }

                  public abstract void Area();

                  public abstract void Extent();

            }

 

O clasa abstracta poate implementa o interfata.

 

interface ILines {

                  void PrintMessage();                 

            }

abstract class Shape :ILines {                 

                  public void PrintMessage(){

                        Console.WriteLine(“o metoda care nu e abstracta”);

                  }

                  public abstract void Area();

                  public abstract void Extent();

            }

 

Cand folosesc o clasa abstracta ?

Cand am implementari commune ale unor metode dar si metode care sigur vor fi implementate insa diferit.

O interfata e un set de metode a caror implementare se va face in clasele care implementeaza interfata respectiva (nu contin nici o implementare).Nu se pot crea instante ale unei interfete.Nivelul de access predefinit este public.

interface IShape{

                  void Area();

            }

abstract class Circle :IShape{

                  public void Area(){

                        Console.WriteLine(“Aceasta metoda trebuie implementata!”);

                  }

            }

Diferenta dintre clasele abstracte si interfete in C# este ca in clasele abstracte putem defini metode care sunt  implementate in respectiva clasa.

O clasa poate deriva dintr-o singura clasa dar poate implementa oricate interfete

O interfata nu permite declararea de constante si membrii pe cand o clasa abstracta da.

Alegerea pentru folosirea unei clase abstracte sau a unei interfete poate fi dificila,iata cateva recomandari :

  • Daca se anticipeaza crearea mai multor versiuni ale unei componente se folosesc clase abstracte.Actualizand clasa de baza toate clasele care o mostenesc se vor actualiza conform schimbarilor.Interfetele odata create nu se pot schimba ,daca se va dori o noua versiune a interfetei atunci trebuie creata o noua interfata.
  • Daca functionalitatea oferita va folosita de mai multe obiecte diferite atunci se vor folosi interfetele.Clasele abstracte sunt folosite in primul rand pentru obiecte care sunt inrudite pe cand interfetele prevad functionalitate comuna pentru clase  neinrudite.
  • Pentru proiectarea unor putine functionalitati se folosesc interfetele .
  • Daca se prevede implementarea unor functionalitati  comune mai multor componente atunci se vor folosi clasele abstracte.

(sursa: http://studentclub.ro/lidia/)

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s