0Pricing
C# Academy · Урок

Полиморфизм и динамическая диспетчеризация

Изучите полиморфизм: вызывайте виртуальные члены через ссылку на базовый тип, используйте коллекции базового типа, избегайте сокрытия методов и безопасно выполняйте приведение при необходимости.

«Полиморфизм и динамическая диспетчеризация» — бесплатный урок C# Academy на CoddyKit. Это урок 3 из 3. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C# Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C# Academy содержит 3 уроков всего.

Обзор полиморфизма

Цель: Использовать один базовый тип и позволить производным типам настраивать поведение.

  • Ссылка на базовый тип, объект производного типа
  • virtual + override → динамическая диспетчеризация
  • Коллекции с базовым типом
  • Избегайте сокрытия methods с помощью new

Основы динамической диспетчеризации

При вызове virtual method используется тип объекта во время выполнения, а не тип переменной во время компиляции.

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
  }
}

Полиморфизм в коллекциях

Храните разные производные типы в List<Base> и единообразно вызывайте виртуальные члены.

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
    }
  }
}

Сокрытие и override

Избегайте сокрытия methods (new). Используйте override для настоящего полиморфизма; при сокрытии через ссылку на базовый тип вызывается базовая версия.

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)
  }
}

Безопасное приведение (as и проверка)

В первую очередь используйте вызовы базового типа и virtual. Если необходимо обратиться к членам, доступным только в производном типе, выполняйте безопасное приведение (as и проверка на null).

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");
    }
  }
}

Советы по полиморфизму

Советы:

  • Сначала проектируйте код для вызовов базового типа и virtual.
  • Используйте override, а не new, чтобы изменить поведение.
  • Делайте APIs базового типа небольшими и стабильными.
  • Выполняйте приведение редко; предпочитайте полиморфизм или интерфейсы.

Значение динамической диспетчеризации

Быстрая проверка: что означает динамическая диспетчеризация в C#?

Итоги

Итоги: Полиморфизм позволяет одному вызову базового типа обращаться к разным вариантам поведения производных типов через virtual/override. Используйте коллекции с базовым типом, избегайте сокрытия с помощью new и выполняйте приведение только при необходимости.

Часто задаваемые вопросы

Урок «Полиморфизм и динамическая диспетчеризация» бесплатный?

Да — полный текст урока «Полиморфизм и динамическая диспетчеризация» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C# Academy, подпишись на CoddyKit PRO. Курс C# Academy содержит 3 уроков всего.

Чему я научусь в уроке «Полиморфизм и динамическая диспетчеризация»?

Изучите полиморфизм: вызывайте виртуальные члены через ссылку на базовый тип, используйте коллекции базового типа, избегайте сокрытия методов и безопасно выполняйте приведение при необходимости. Ты практикуешь C# Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать C# Academy?

Предыдущий опыт не требуется. C# Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 3.

Сколько времени занимает урок «Полиморфизм и динамическая диспетчеризация»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке C# Academy?

Да. Каждый урок C# Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. virtual/override/sealed и абстрактные классы
  2. Интерфейсы (введение) и реализация нескольких интерфейсов
  3. Полиморфизм и динамическая диспетчеризация
← Назад к C# Academy