C# Academy · Lektion

Polymorfi og dynamisk dispatch

Forstå polymorfi: kald virtuelle medlemmer gennem en base-reference, brug collections med base-typer, undgå method hiding, og cast sikkert efter behov.

Lektion 3 af 38 trin

Polymorfi og dynamisk dispatch er en gratis C# Academy-lektion på CoddyKit. Dette er lektion 3 af 3. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i C# Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. C# Academy-kurset indeholder 3 lektioner i alt.

Oversigt over polymorfi

Mål: Brug én basetype, og lad afledte typer tilpasse adfærden.

  • Basereference, afledt objekt
  • virtual + override → dynamisk dispatch
  • Samlinger af basetypen
  • Undgå at skjule metoder med new

Grundlæggende dynamisk dispatch

Et kald til en virtual-metode bruger objektets type ved kørsel, ikke variablens type ved kompilering.

using System;

public class Animal
{
  public virtual string Speak() { return "???"; }
}

public class Cat : Animal
{
  public override string Speak() { return "Meow"; }
}

public class Dog : Animal
{
  public override string Speak() { return "Woof"; }
}

public class Program
{
  public static void Main(string[] args)
  {
    Animal a1 = new Cat(); // base reference
    Animal a2 = new Dog();
    Console.WriteLine(a1.Speak()); // Meow
    Console.WriteLine(a2.Speak()); // Woof
  }
}

Polymorfi i samlinger

Gem forskellige afledte typer i en List<Base>, og kald virtual-medlemmer ensartet.

using System;
using System.Collections.Generic;

public class Shape
{
  public virtual double Area() { return 0.0; }
}

public class Rectangle : Shape
{
  private readonly int _w, _h;
  public Rectangle(int w, int h) { _w = w; _h = h; }
  public override double Area() { return _w * _h; }
}

public class Circle : Shape
{
  private readonly int _r;
  public Circle(int r) { _r = r; }
  public override double Area() { return 3.14159 * _r * _r; }
}

public class Program
{
  public static void Main(string[] args)
  {
    List<Shape> shapes = new List<Shape>();
    shapes.Add(new Rectangle(3, 4));
    shapes.Add(new Circle(2));

    foreach (Shape s in shapes)
    {
      Console.WriteLine("Area = " + s.Area()); // calls correct override
    }
  }
}

Skjuling kontra override

Undgå at skjule metoder (new). Brug override til ægte polymorfi; skjuling kalder basetypens version via en basereference.

using System;

public class Printer
{
  public virtual void Print() { Console.WriteLine("[Base]"); }
}

public class LoudPrinter : Printer
{
  public override void Print() { Console.WriteLine("[LOUD]"); }
}

public class HiddenPrinter : Printer
{
  // Hides the base method instead of overriding (BAD fit for polymorphism)
  public new void Print() { Console.WriteLine("[HIDDEN]"); }
}

public class Program
{
  public static void Main(string[] args)
  {
    Printer a = new LoudPrinter();
    Printer b = new HiddenPrinter();

    a.Print(); // [LOUD]  (override works)
    b.Print(); // [Base]  (hiding fails via base reference)
  }
}

Sikker typekonvertering (as + kontrol)

Foretræk kald via basetypen/virtual. Hvis du er nødt til at bruge medlemmer, der kun findes i afledte typer, skal du foretage en sikker typekonvertering (as + null-kontrol).

using System;

public class Vehicle
{
  public virtual string Info() { return "Vehicle"; }
}

public class Car : Vehicle
{
  public bool HasAirConditioning;
  public override string Info() { return "Car"; }
}

public class Program
{
  public static void Main(string[] args)
  {
    Vehicle v = new Car();
    Console.WriteLine(v.Info()); // polymorphic call

    // Need a Car-only member? Cast carefully using 'as'
    Car c = v as Car;
    if (c != null)
    {
      c.HasAirConditioning = true;
      Console.WriteLine("AC set: " + c.HasAirConditioning);
    }
    else
    {
      Console.WriteLine("Not a Car");
    }
  }
}

Tip til polymorfi

Tip:

  • Design først med kald via basetypen/virtual.
  • Brug override, ikke new, til at ændre adfærd.
  • Hold base-API'er små og stabile.
  • Foretag sjældent typekonverteringer; foretræk polymorfi eller grænseflader.

Betydningen af dynamisk dispatch

Hurtigt tjek: Hvad betyder dynamisk dispatch i C#?

Opsamling

Opsamling: Polymorfi gør, at ét kald via basetypen kan nå mange afledte adfærdsvarianter gennem virtual/override. Brug samlinger af basetypen, undgå skjuling med new, og foretag kun typekonverteringer, når det er nødvendigt.

Gratis at komme i gang

Lær C# med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
93
Lektioner
346

Ofte stillede spørgsmål

Er lektionen “Polymorfi og dynamisk dispatch” gratis?

Ja — hele teksten til “Polymorfi og dynamisk dispatch” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af C# Academy-kurset, skal du opgradere til CoddyKit PRO. C# Academy-kurset indeholder 3 lektioner i alt.

Hvad lærer jeg i “Polymorfi og dynamisk dispatch”?

Forstå polymorfi: kald virtuelle medlemmer gennem en base-reference, brug collections med base-typer, undgå method hiding, og cast sikkert efter behov. Du øver dig i C# Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på C# Academy?

Der kræves ingen tidligere erfaring. C# Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 3.

Hvor lang tid tager lektionen “Polymorfi og dynamisk dispatch”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne C# Academy-lektion?

Ja. Alle C# Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. virtual/override/sealed; abstrakte klasser
  2. Interfaces (introduktion) og implementering af flere interfaces
  3. Polymorfi og dynamisk dispatch
← Tilbage til C# Academy