English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

C# базовый учебник

C# продвинутый учебник

C#面向对象(OOP)

Наследование (Inheritance) в C#

Наследование - это один из самых важных концепций в面向对象的 программировании. Наследование позволяет нам определять один класс на основе другого, что упрощает создание и поддержку приложений. Это также полезно для повторного использования кода и экономии времени на разработку.

Когда создается класс, программист не обязан полностью переписывать новые данные и функции, достаточно спроектировать новый класс, наследующий члены существующего класса. Этот существующий класс называетсяБазовый классЭтот новый класс называетсяПроизводный класс.

Идея наследования реализована Является (IS-A) Отношения. Например, млекопитающие Является (IS-A) Животные, собака Является (IS-A) Млекопитающие, поэтому собака Является (IS-A) Животные.

Базовый класс и производный класс

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

Синтаксис создания производного класса в C# такой:

<Доступ_доступности> class <Базовый_класс>
{
 ...
}
class <Производный_класс> : <Базовый_класс>
{
 ...
}

Предположим, у нас есть базовый класс Shape, его производный класс - Rectangle:

using System;
namespace InheritanceApplication
{
   class Shape
   {
      public void setWidth(int w)
      {
         width = w;
      }
      public void setHeight(int h)
      {
         height = h;
      }
      protected int width;
      protected int height;
   }

   // 派生类
   class Rectangle: Shape
   {
      public int getArea()
      {
         return (width * height);
      }
   }
   
   class RectangleTester
   {
      static void Main(string[] args)
      {
         Rectangle Rect = new Rectangle();

         Rect.setWidth(5);
         Rect.setHeight(7);

         // Print the area of the object
         Console.WriteLine("Общая площадь: {0}", Rect.getArea());
         Console.ReadKey();
      }
   }
}

Когда вышеуказанный код компилируется и выполняется, он produces следующий результат:

Общая площадь: 35

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

Деривированные классы наследуют переменные и методы базового класса. Поэтому объект базового класса должен быть создан до объекта производного класса. Вы можете инициализировать базовый класс в списке инициализации членов.

Ниже приведен пример программы, демонстрирующий это:

using System;
namespace RectangleApplication
{
   class Rectangle
   {
      // переменные члена
      protected double length;
      protected double width;
      public Rectangle(double l, double w)
      {
         length = l;
         width = w;
      }
      public double GetArea()
      {
         return length * width;
      }
      public void Display()
      {
         Console.WriteLine("Длина: {0}", length);
         Console.WriteLine("Ширина: {0}", width);
         Console.WriteLine("Площадь: {0}", GetArea());
      }
   //end class Rectangle  
   class Tabletop : Rectangle
   {
      private double cost;
      public Tabletop(double l, double w) : base(l, w)
      { }
      public double GetCost()
      {
         double cost;
         cost = GetArea() * 70;
         return cost;
      }
      public void Display()
      {
         base.Display();
         Console.WriteLine("Стоимость: {0}", GetCost());
      }
   }
   class ExecuteRectangle
   {
      static void Main(string[] args)
      {
         Tabletop t = new Tabletop(4.5, 7.5);
         t.Display();
         Console.ReadLine();
      }
   }
}

Когда вышеуказанный код компилируется и выполняется, он produces следующий результат:

Длина: 4.5
Ширина: 7.5
Площадь: 33.75
Стоимость: 2362.5

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

Множественное наследование означает, что класс может наследовать поведение и характеристики из более чем одного родительского класса. В противоположность этому, однонаследие означает, что класс может наследовать только от одного родительского класса.

C# не поддерживает множественное наследованиеНо вы можете использовать интерфейсы для реализации множественного наследования. Ниже приведен пример программы, демонстрирующий это:

using System;
namespace InheritanceApplication
{
   class Shape
   {
      public void setWidth(int w)
      {
         width = w;
      }
      public void setHeight(int h)
      {
         height = h;
      }
      protected int width;
      protected int height;
   }

   // 基类 PaintCost
   public interface PaintCost
   {
      int getCost(int area);

   }
   // 派生类
   class Rectangle : Shape, PaintCost
   {
      public int getArea()
      {
         return (width * height);
      }
      public int getCost(int area)
      {
         return area * 70;
      }
   }
   class RectangleTester
   {
      static void Main(string[] args)
      {
         Rectangle Rect = new Rectangle();
         int area;
         Rect.setWidth(5);
         Rect.setHeight(7);
         area = Rect.getArea();
         // Print the area of the object
         Console.WriteLine("Общая площадь: {0}", Rect.getArea());
         Console.WriteLine("Общий затрат на краску: ${0}", Rect.getCost(area));
         Console.ReadKey();
      }
   }
}

Когда вышеуказанный код компилируется и выполняется, он produces следующий результат:

Общая площадь: 35
Общий затрат на краску: $2450