Sobes.tech
Middle

Kokiais atvejais turėtumėte naudoti sąsają, o kokiais — abstrakčią klasę?

sobes.tech AI

Atsakymas iš AI

Naudokite sąsajos apibrėžti elgesio sutartį, kurią gali įgyvendinti klasės. Tai leidžia pasiekti polimorfizmą ir sumažinti priklausomybę tarp klasių. Klasė gali turėti kelias sąsajas, bet tik vieną pagrindinę klasę:

Naudokite abstrakčias klases, kai turite bendrą funkcionalumo įgyvendinimą ir norite suteikti pagrindinę struktūrą vaikų klasėms. Abstrakčiosios klasės gali turėti abstrakčius ir įprastus metodus, taip pat laukus. Jos tinkamos, kai reikalinga paveldėjimas "yra".

Bruožas Sąsaja Abstrakti klasė
Daugkartinis paveldėjimas Taip Ne
Įgyvendinimo buvimas Ne (iki .NET 8 su numatytaisiais sąsajos metodais) Taip, dalinis arba pilnas
Laukai Ne Taip
Konstruktoriai Ne Taip
Santykio tipas "gali padaryti" ("has-a") "yra" ("is-a")

Pavyzdys, kaip naudoti sąsają:

// Apibrėžiame sutartį objektams, galintiems skraidyti
public interface IFlyable
{
    void Fly();
}

// Lėktuvo klasė įgyvendina IFlyable sąsają
public class Airplane : IFlyable
{
    public void Fly()
    {
        // Lėktuvo skrydžio įgyvendinimas
        Console.WriteLine("Lėktuvas skraido");
    }
}

// Paukščio klasė taip pat įgyvendina IFlyable sąsają
public class Bird : IFlyable
{
    public void Fly()
    {
        // Paukščio skrydžio įgyvendinimas
        Console.WriteLine("Paukštis skraido");
    }
}

Pavyzdys, kaip naudoti abstrakčią klasę:

// Abstrakti klasė gyvūnas su bendru kvėpavimo įgyvendinimu
public abstract class Animal
{
    public void Breathe()
    {
        Console.WriteLine("Gyvūnas kvėpuoja");
    }

    // Abstraktus metodas, kurį turi įgyvendinti paveldėjęs
    public abstract void MakeSound();
}

// Konkretus šuns klasė, paveldinti iš Animal
public class Dog : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine("Gau!");
    }
}

// Konkretus katės klasė, paveldinti iš Animal
public class Cat : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine("Miau!");
    }
}