C# Academy · Oppitunti

Polymorfiset toimintatavat

Käyttäkää rajapintapohjaista polymorfismia: käsitelkää erilaisia muotoja yhdenmukaisesti, lisätkää uusia muotoja muuttamatta kutsujia ja koostakaa pieniä toimintatapoja.

Oppitunti 3/38 vaihetta

Polymorfiset toimintatavat on ilmainen C# Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/3. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu C# Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. C# Academy-kurssilla on yhteensä 3 oppituntia.

Polymorfismin yleiskatsaus

Tavoite: Käyttäkää polymorfismia kutsujien pitämiseen yksinkertaisina.

  • Työskennelkää kaikkialla IShape-rajapinnan kanssa
  • Yhdistäkää monia muotoja samaan listaan
  • Lisätkää uusia muotoja muuttamatta olemassa olevaa koodia
  • Koostakaa pieniä toimintoja, kuten muotoilua ja suodatusta

Yksi rajapinta kaikille muodoille

Ottakaa apumetodeissa vastaan IShape-rajapinta. Ajonaikainen kutsunvälitys valitsee oikean toteutuksen.

using System;

public interface IShape
{
  double Area();
  double Perimeter();
}

public sealed class Rectangle : IShape
{
  private readonly double _w, _h;
  public Rectangle(double w, double h) { _w = w; _h = h; }
  public double Area() { return _w * _h; }
  public double Perimeter() { return 2 * (_w + _h); }
}

public sealed class Circle : IShape
{
  private readonly double _r;
  public Circle(double r) { _r = r; }
  public double Area() { return 3.14159 * _r * _r; }
  public double Perimeter() { return 2 * 3.14159 * _r; }
}

public class Program
{
  // One function works for any IShape (dynamic dispatch on overrides)
  static void PrintSummary(IShape s)
  {
    Console.WriteLine("A=" + s.Area() + " P=" + s.Perimeter());
  }

  public static void Main(string[] args)
  {
    PrintSummary(new Rectangle(3, 4));
    PrintSummary(new Circle(2));
  }
}

Sekalaisen listan käsittely

Tallentakaa useita muotoja kohteeseen List<IShape>. Iterointi pysyy yksinkertaisena, vaikka toiminta vaihtelee ilmentymän mukaan.

using System;
using System.Collections.Generic;

public interface IShape { double Area(); double Perimeter(); }

public sealed class Rectangle : IShape
{
  private readonly double _w, _h;
  public Rectangle(double w, double h) { _w = w; _h = h; }
  public double Area() { return _w * _h; }
  public double Perimeter() { return 2 * (_w + _h); }
}

public sealed class Circle : IShape
{
  private readonly double _r;
  public Circle(double r) { _r = r; }
  public double Area() { return 3.14159 * _r * _r; }
  public double Perimeter() { return 2 * 3.14159 * _r; }
}

public class Program
{
  public static void Main(string[] args)
  {
    List<IShape> shapes = new List<IShape>();
    shapes.Add(new Rectangle(2, 5));
    shapes.Add(new Circle(1.5));
    shapes.Add(new Rectangle(1, 1));

    foreach (IShape s in shapes)
    {
      Console.WriteLine("A=" + s.Area());
    }
  }
}

Avoin laajennettavuus

Polymorfismi tukee avointa laajennettavuutta: uudet muodot voidaan ottaa käyttöön muokkaamatta olemassa olevia kutsujia.

using System;

public interface IShape { double Area(); double Perimeter(); }

public sealed class Triangle : IShape
{
  private readonly double _a, _b, _c;
  public Triangle(double a, double b, double c) { _a = a; _b = b; _c = c; }
  public double Perimeter() { return _a + _b + _c; }
  public double Area()
  {
    double s = (_a + _b + _c) / 2.0;
    return Math.Sqrt(s * (s - _a) * (s - _b) * (s - _c));
  }
}

public class Program
{
  // Existing helper still works; no changes needed
  static void Show(IShape s) { Console.WriteLine("A=" + s.Area() + " P=" + s.Perimeter()); }

  public static void Main(string[] args)
  {
    Show(new Triangle(3, 4, 5)); // new type plugs in
  }
}

Käyttäytymisen koostaminen (strategy)

Koostakaa pieniä toimintoja pienten rajapintojen, kuten formatter-rajapinnan, avulla. Vaihtakaa strategioita muuttamatta muotoa.

using System;

public interface IShape { double Area(); double Perimeter(); }

public sealed class Rectangle : IShape
{
  private readonly double _w, _h;
  public Rectangle(double w, double h) { _w = w; _h = h; }
  public double Area() { return _w * _h; }
  public double Perimeter() { return 2 * (_w + _h); }
}

// Small strategy interface for formatting
public interface IShapeFormatter
{
  string Format(IShape s);
}

public sealed class SimpleFormatter : IShapeFormatter
{
  public string Format(IShape s) { return "A=" + s.Area() + " P=" + s.Perimeter(); }
}

public class Program
{
  static void Print(IShape s, IShapeFormatter f)
  {
    Console.WriteLine(f.Format(s));
  }

  public static void Main(string[] args)
  {
    Print(new Rectangle(3, 2), new SimpleFormatter());
  }
}

Polymorfismivinkkejä

Vinkkejä:

  • Välittäkää IShape apumetodeille ja välttäkää tyyppitarkistuksia.
  • Pitäkää apumetodit pieninä ja mahdollisuuksien mukaan puhtaina.
  • Lisätkää uusia muotoja vapaasti älkääkä muokatko olemassa olevia kutsujia.
  • Käyttäkää pieniä käyttäytymistä kuvaavia rajapintoja, kuten muotoiluun ja suodatukseen tarkoitettuja rajapintoja, ominaisuuksien laajentamiseen.

Rajapinnan hyöty

Pikakysymys: Mikä on tässä kirjastossa IShape-rajapintaa vasten ohjelmoinnin tärkein hyöty?

Kertaus

Kertaus: Ottakaa parametreina vastaan IShape, käsitelkää sekalaisia listoja ja lisätkää muotoja koskematta kutsujiin. Koostakaa pieniä toimintoja muotoilua tai suodatusta varten, jotta koodi pysyy joustavana.

Aloita maksutta

Opi C# tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
93
Oppitunnit
346

Usein kysytyt kysymykset

Onko oppitunti ”Polymorfiset toimintatavat” ilmainen?

Kyllä – oppitunnin ”Polymorfiset toimintatavat” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko C# Academy-kurssin, päivitä CoddyKit PROhon. C# Academy-kurssilla on yhteensä 3 oppituntia.

Mitä opin oppitunnilla ”Polymorfiset toimintatavat”?

Käyttäkää rajapintapohjaista polymorfismia: käsitelkää erilaisia muotoja yhdenmukaisesti, lisätkää uusia muotoja muuttamatta kutsujia ja koostakaa pieniä toimintatapoja. Harjoittelet C# Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni C# Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin C# Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/3.

Kuinka kauan ”Polymorfiset toimintatavat”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä C# Academy-oppitunnilla?

Kyllä. Jokainen C# Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Suunnittelu (rajapinnat ja periytyminen)
  2. Toteutus ja testit
  3. Polymorfiset toimintatavat
← Takaisin: C# Academy