Sobes.tech
Junior

Ar naudojote abstrakčias klases savo projektuose?

sobes.tech AI

Atsakymas iš AI

Taip, naudoju. Abstraktūs klasės buvo naudojamos kuriant pagrindines struktūras su bendrais metodais ir savybėmis, kurios vėliau paveldimos konkrečiuose klasėse.

// Abstraktaus klasės deklaravimas
public abstract class Shape
{
    // Abstraktus metodas, kuris turi būti įgyvendintas paveldėtuose klasėse
    public abstract double GetArea();

    // Virtualus metodas su numatytu įgyvendinimu, kurį galima perrašyti
    public virtual void Draw()
    {
        Console.WriteLine("Brėžiama forma.");
    }
}

// Konkreti klasė, paveldinti iš Shape
public class Circle : Shape
{
    public double Radius { get; set; }

    public Circle(double radius)
    {
        Radius = radius;
    }

    // Abstraktaus metodo įgyvendinimas
    public override double GetArea()
    {
        return Math.PI * Radius * Radius;
    }

    // Perrašyti virtualų metodą
    public override void Draw()
    {
        Console.WriteLine($"Brėžiama apskritimas su spinduliu {Radius}.");
    }
}

Pagrindiniai scenarijai:

  • Bendro kontrakto apibrėžimas: Abstraktūs klasės leidžia nustatyti metodų ir savybių rinkinį, kuris turi būti visose paveldėtose klasėse.
  • Dalinis įgyvendinimas: Galimybė pateikti dalinį įgyvendinimą pagrindinėje klasėje, išvengiant visiško kodo dubliavimo paveldėtose klasėse.
  • Dizaino šablonas: Dažnai naudojamas įgyvendinant šablonų, tokių kaip "Šablono metodas".

Skirtumai nuo sąsajų:

Savybė Abstrakti klasė Sąsaja
Paveldėjimas Draudžiama daugkartinė paveldėjimas Leidžiama daugkartinė įgyvendinimas
Įgyvendinimas Gali turėti įgyvendinimo metodus Iki C# 8.0 - tik deklaracijos, po 8.0 - numatytasis įgyvendinimas
Nariai Gali turėti laukus, konstruktorius, virtualius/abstrakčius/įprastus metodus Iki C# 8.0 - tik metodai ir savybės, po 8.0 - taip pat statiniai nariai ir numatytosios įgyvendinimai
Būsena Gali turėti būseną (per laukus) Negali turėti būsenos