Sobes.tech
Junior

Kas kasutas oma projektides abstraktseid klasse?

sobes.tech AI

Vastus AI-lt

Jah, ma kasutan. Abstraktsed klassid kasutati põhistruktuuride loomisel koos üldiste meetodite ja omadustega, mis seejärel päranduvad konkreetsetele klassidele.

// Abstraktse klassi deklaratsioon
public abstract class Shape
{
    // Abstraktne meetod, mida peavad rakendama pärandavad klassid
    public abstract double GetArea();

    // Virtuaalne meetod koos vaikimisi rakendusega, mida saab üle kirjutada
    public virtual void Draw()
    {
        Console.WriteLine("Joonistatakse kuju.");
    }
}

// Konkreetne klass, mis pärineb Shape
public class Circle : Shape
{
    public double Radius { get; set; }

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

    // Abstraktse meetodi rakendamine
    public override double GetArea()
    {
        return Math.PI * Radius * Radius;
    }

    // Virtuaalse meetodi üle kirjutamine
    public override void Draw()
    {
        Console.WriteLine($"Joonistatakse ring raadiusega {Radius}.");
    }
}

Peamised stsenaariumid:

  • Üldise lepingu määratlemine: Abstraktsed klassid võimaldavad määratleda meetodite ja omaduste komplekti, mis peavad olema kõigis pärandklassides.
  • Osaline rakendus: Võimalus pakkuda osalist rakendust põhiklassis, vältides koodi täielikku dubleerimist pärandklassides.
  • Mudel: Kasutatakse sageli disainimustrites nagu "Mudelimeetod".

Erinevused liidestega:

Omadus Abstraktne klass Liides
Pärimine Mitmepärimine on keelatud Mitmepärimine on lubatud
Rakendamine Võib sisaldada meetodite rakendusi C# 8.0-ni - ainult deklaratsioonid, pärast - vaikimisi rakendus
Liikmed Võib sisaldada välju, konstruktorid, virtuaalseid/abstraktseid/tavalisi meetodeid C# 8.0-ni - ainult meetodid ja omadused, pärast - ka staatilised liikmed ja vaikimisi rakendused
Seisund Võib omada seisundit (väljade kaudu) Ei saa omada seisundit