Sobes.tech
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("Мјау!");
    }
}