Middle
U kojim slučajevima treba koristiti interfejs, a u kojim apstraktnu klasu?
sobes.tech АИ
Одговор од АИ
Користите интерфејсе за дефинисање контракта за понашање који класе могу да реализују. Ово омогућава постизање полиморфизма и слабљење повезаности између класа. Једна класа може имати више интерфејса, али само једну основну класу.
Користите апстрактне класе када имате заједничу реализацију делова функционалности и желите да пружите основну структуру за подкласе. Апстрактне класе могу садржати апстрактне и обичне методе, као и поља. Погодне су када је потребно наслеђивање "је".
| Карактеристика | Интерфејс | Апстрактна класа |
|---|---|---|
| Множење наслеђивања | Да | Не |
| Постојање реализације | Не (до .NET 8 са подразумеваним методама интерфејса) | Да, делимична или потпуна |
| Поља | Не | Да |
| Конструктори | Не | Да |
| Тип односа | "може да уради" ("has-a") | "је" ("is-a") |
Пример коришћења интерфејса:
// Дефинисање контракта за објекте који умеју да лете
public interface IFlyable
{
void Fly();
}
// Клас авион реализује интерфејс IFlyable
public class Airplane : IFlyable
{
public void Fly()
{
// Реализација лета авиона
Console.WriteLine("Авио лети");
}
}
// Клас птица такође реализује интерфејс IFlyable
public class Bird : IFlyable
{
public void Fly()
{
// Реализација лета птице
Console.WriteLine("Птица лети");
}
}
Пример коришћења апстрактне класе:
// Апстрактна класа животиња са заједничком реализацијом дисања
public abstract class Animal
{
public void Breathe()
{
Console.WriteLine("Животиња дише");
}
// Апстрактна метода коју морају реализовати наследници
public abstract void MakeSound();
}
// Конкретна класа пас, која наследи од Animal
public class Dog : Animal
{
public override void MakeSound()
{
Console.WriteLine("Гав!");
}
}
// Конкретна класа мачка, која наследи од Animal
public class Cat : Animal
{
public override void MakeSound()
{
Console.WriteLine("Мјау!");
}
}