С# — Наследование
Одной из наиболее важных концепций объектно-ориентированного программирования является наследование. Наследование позволяет нам определять класс в терминах другого класса, что упрощает создание и поддержку приложения. Это также дает возможность повторно использовать функции кода и ускоряет время реализации.
При создании класса вместо написания совершенно новых элементов данных и функций-членов программист может указать, что новый класс должен наследовать элементы существующего класса. Этот существующий класс называется базовым класс, а новый класс называется производным класс.
Идея наследования реализует IS-A отношение. Например, млекопитающие IS A животное, собака IS-A млекопитающее, следовательно, собака IS-A также животное и т. д.
Базовые и производные классы
Класс может быть производным от более чем одного класса или интерфейса, что означает, что он может наследовать данные и функции от нескольких базовых классов или интерфейсов.
Синтаксис, используемый в C# для создания производных классов, следующий:
<acess-specifier> class <base_class> { ... } class <derived_class> : <base_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; } // Derived class 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("Total area: {0}", Rect.getArea()); Console.ReadKey(); } } }
Когда приведенный выше код скомпилирован и выполнен, он дает следующий результат —
Total area: 35
Инициализация базового класса
Производный класс наследует переменные-члены базового класса и методы-члены. Поэтому объект суперкласса должен быть создан до создания подкласса. Вы можете дать инструкции по инициализации суперкласса в списке инициализации членов.
Следующая программа демонстрирует это —
Живая демонстрацияusing System; namespace RectangleApplication { class Rectangle { //member variables 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("Length: {0}", length); Console.WriteLine("Width: {0}", width); Console.WriteLine("Area: {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("Cost: {0}", GetCost()); } } class ExecuteRectangle { static void Main(string[] args) { Tabletop t = new Tabletop(4.5, 7.5); t.Display(); Console.ReadLine(); } } }
Когда приведенный выше код скомпилирован и выполнен, он дает следующий результат —
Length: 4.5 Width: 7.5 Area: 33.75 Cost: 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; } // Base class PaintCost public interface PaintCost { int getCost(int area); } // Derived class 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("Total area: {0}", Rect.getArea()); Console.WriteLine("Total paint cost: ${0}" , Rect.getCost(area)); Console.ReadKey(); } } }
Когда приведенный выше код скомпилирован и выполнен, он дает следующий результат —
Total area: 35 Total paint cost: $2450
Язык C