Полиморфное поведение
Используйте полиморфизм на основе интерфейсов: единообразно обрабатывайте смешанные фигуры, добавляйте новые фигуры без изменения вызывающего кода и объединяйте небольшие варианты поведения.
«Полиморфное поведение» — бесплатный урок C# Academy на CoddyKit. Это урок 3 из 3. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C# Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C# Academy содержит 3 уроков всего.
Обзор полиморфизма
Цель: использовать полиморфизм, чтобы упростить вызывающий код.
- Повсюду работайте с IShape
- Храните разные фигуры в одном списке
- Добавляйте новые фигуры без изменения существующего кода
- Объединяйте небольшие виды поведения (форматирование, фильтрация)
Один интерфейс для всех фигур
Принимайте интерфейс IShape во вспомогательных средствах. Диспетчеризация во время выполнения выбирает нужную реализацию.
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));
}
}
Обработка смешанного списка
Храните множество фигур в списке <IShape>. Перебор остаётся простым, а поведение меняется в зависимости от экземпляра.
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());
}
}
}
Открытость для расширения
Полиморфизм поддерживает открытое расширение: новые фигуры подключаются без изменения существующего вызывающего кода.
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
}
}
Композиция поведения (стратегия)
Объединяйте небольшие виды поведения через малые интерфейсы (например, форматировщик). Меняйте стратегии, не изменяя фигуру.
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());
}
}
Советы по полиморфизму
Советы:
- Передавайте во вспомогательные средства IShape; избегайте проверок типов.
- По возможности делайте вспомогательные средства небольшими и чистыми.
- Свободно добавляйте новые фигуры; не изменяйте существующий вызывающий код.
- Используйте небольшие интерфейсы поведения (форматирование, фильтрация) для расширения возможностей.
Преимущество интерфейса
Повторение
Повторение: принимайте параметры типа IShape, обрабатывайте смешанные списки и добавляйте фигуры, не изменяя вызывающий код. Объединяйте небольшие виды поведения для форматирования или фильтрации, чтобы код оставался гибким.
Часто задаваемые вопросы
Урок «Полиморфное поведение» бесплатный?
Да — полный текст урока «Полиморфное поведение» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 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 — локальная установка не требуется.
Все уроки этого курса
- Проектирование (интерфейсы и наследование)
- Реализация и тесты
- Полиморфное поведение