English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Наследование - это один из самых важных концепций в面向对象的 программировании. Наследование позволяет нам определять один класс на основе другого, что упрощает создание и поддержку приложений. Это также полезно для повторного использования кода и экономии времени на разработку.
Когда создается класс, программист не обязан полностью переписывать новые данные и функции, достаточно спроектировать новый класс, наследующий члены существующего класса. Этот существующий класс называетсяБазовый классЭтот новый класс называетсяПроизводный класс.
Идея наследования реализована Является (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# не поддерживает множественное наследованиеНо вы можете использовать интерфейсы для реализации множественного наследования. Ниже приведен пример программы, демонстрирующий это:
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