Middle
În ce cazuri trebuie să folosiți o interfață și în care o clasă abstractă?
sobes.tech AI
Răspuns de la AI
Utilizați interfețe pentru a defini contractul de comportament pe care îl pot implementa clasele. Acest lucru permite atingerea polimorfismului și slăbește cuplarea între clase. O clasă poate avea mai multe interfețe, dar doar o clasă de bază.
Utilizați clase abstracte atunci când aveți o implementare comună a unei părți din funcționalitate și doriți să oferiți o structură de bază pentru clasele derivate. Clasele abstracte pot conține metode abstracte și normale, precum și câmpuri. Sunt potrivite atunci când este necesară moștenirea "este".
| Caracteristică | Interfață | Clasă abstractă |
|---|---|---|
| Moștenire multiplă | Da | Nu |
| Implementare | Nu (până la .NET 8 cu metode de interfață implicite) | Da, parțial sau complet |
| Câmpuri | Nu | Da |
| Constructori | Nu | Da |
| Tip relație | "poate face" ("has-a") | "este" ("is-a") |
Exemplu de utilizare a interfeței:
// Definim un contract pentru obiecte care pot zbura
public interface IFlyable
{
void Fly();
}
// Clasa avion implementează interfața IFlyable
public class Airplane : IFlyable
{
public void Fly()
{
// Implementarea zborului avionului
Console.WriteLine("Avionul zboară");
}
}
// Clasa pasăre implementează și ea interfața IFlyable
public class Bird : IFlyable
{
public void Fly()
{
// Implementarea zborului păsării
Console.WriteLine("Pasărea zboară");
}
}
Exemplu de utilizare a unei clase abstracte:
// Clasă abstractă Animal cu o implementare comună a respirației
public abstract class Animal
{
public void Breathe()
{
Console.WriteLine("Animalul respiră");
}
// Metodă abstractă pe care trebuie să o implementeze clasele derivate
public abstract void MakeSound();
}
// Clasă concretă de câine care moștenește de la Animal
public class Dog : Animal
{
public override void MakeSound()
{
Console.WriteLine("Ham!");
}
}
// Clasă concretă de pisică care moștenește de la Animal
public class Cat : Animal
{
public override void MakeSound()
{
Console.WriteLine("Miau!");
}
}