Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> Язык C

Наследование в C#: базовые и производные классы, интерфейсы

Что такое наследование

Наследование — механизм, позволяющий определить новый класс на основе существующего. Производный (derived) класс наследует члены базового (base) класса. Реализует отношение IS-A (собака IS-A млекопитающее IS-A животное).

Преимущества: повторное использование кода, расширяемость, иерархия типов.

Синтаксис

class BaseClass { ... }
class DerivedClass : BaseClass { ... }

Пример: Shape и Rectangle

public class Shape
{
    public void SetWidth(int w) => Width = w;
    public void SetHeight(int h) => Height = h;
    protected int Width;  // доступно в наследниках
    protected int Height;
}

public class Rectangle : Shape
{
    public int GetArea() => Width * Height;
}

// Использование
Rectangle rect = new Rectangle();
rect.SetWidth(5);
rect.SetHeight(7);
Console.WriteLine(rect.GetArea()); // 35

Инициализация базового класса

Конструктор базового класса вызывается ПЕРЕД конструктором производного. Явный вызов через base(...):

public class Rectangle
{
    protected double Length, Width;
    public Rectangle(double l, double w) { Length = l; Width = w; }
    public double GetArea() => Length * Width;
}

public class Tabletop : Rectangle
{
    private double CostPerSqUnit = 70;
    
    // Вызов базового конструктора
    public Tabletop(double l, double w) : base(l, w) { }
    
    public double GetCost() => GetArea() * CostPerSqUnit;
}

Множественное наследование

C# НЕ поддерживает множественное наследование классов (один базовый класс максимум). Но можно реализовать через интерфейсы:

public interface IPaintCost
{
    int GetCost(int area);
}

public class Rectangle : Shape, IPaintCost
{
    public int GetArea() => Width * Height;
    public int GetCost(int area) => area * 70;
}

Модификаторы наследования

МодификаторЗначение
virtualМетод/свойство можно переопределить в наследнике
overrideПереопределяет virtual/abstract член базового класса
abstractОбязательно к переопределению; класс тоже должен быть abstract
sealedЗапрещает наследование класса или переопределение члена
newСкрывает унаследованный член (не переопределяет!)

Пример: virtual / override

public class Shape
{
    public virtual double Area() => 0;
}

public class Circle : Shape
{
    public double Radius { get; set; }
    public override double Area() => Math.PI * Radius * Radius;
}

public class Square : Shape
{
    public double Side { get; set; }
    public override double Area() => Side * Side;
}

// Полиморфизм
Shape[] shapes = { new Circle { Radius = 2 }, new Square { Side = 3 } };
foreach (var s in shapes) Console.WriteLine(s.Area());

Base — доступ к членам базового класса

Защищённые члены (protected)

Доступны в производных классах, но не снаружи. Идеально для полей, используемых наследниками.

Скрытие членов (new)

public class Base { public void Show() => Console.WriteLine("Base"); }
public class Derived : Base { public new void Show() => Console.WriteLine("Derived"); }

Base b = new Derived();
b.Show(); // "Base" — вызов через базовую ссылку
((Derived)b).Show(); // "Derived"

Используйте new осознанно (компилятор выдаст warning без него).

Язык C

  1. Классы и объекты в C#: Фундаменты надёжного ООП
  2. Ключевое слово static в C#: статические переменные, методы и классы
  3. Вложенные классы в C#: определение, использование и наследование
  4. Шаблоны классов в C++: практическое руководство
  5. Наследование в Python: концепции, синтаксис и практические примеры
  6. Анонимные внутренние классы в Java: определение, синтаксис и практические примеры
  7. Освоение Java ObjectOutputStream: сериализация, методы и практические примеры
  8. Освоение Java Generics: создание переиспользуемого, типобезопасного кода
  9. Мастерство файловых операций в Java с java.io: создание, чтение, запись и удаление
  10. Структура программы на C#: основные компоненты и пример Hello World