![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Основные сведения. Особенности наследования в C#
Особенности наследования в C# Наследование является мощнейшим инструментом ООП. Оно позволяет строить иерархии, в которых производные классы (классы-потомки) получают свойства базовых классов (классов-предков) и могут дополнять их или изменять. Наследование применяется для следующих взаимосвязанных целей: - исключения из программы повторяющихся фрагментов кода; - упрощения модификации программы; - упрощения создания новых программ на основе существующих. Особенности наследования в C#: класс может иметь произвольное количество производных классов; класс может наследовать только от одного базового класса; при наследовании производный класс получает практически все элементы базового класса; элементы базового класса, объявленные со спецификатором private не доступны производным классам непосредственно; элементы базового класса, объявленные со спецификатором protected доступны только производным классам. Конструкторы не наследуются, поэтому производный класс должен иметь собственные конструкторы (созданные программистом или системой). Порядок вызова конструкторов: Если в конструкторе производного класса явный вызов конструктора базового класса отсутствует, автоматически вызывается конструктор базового класса без параметров. Для иерархии, состоящей из нескольких уровней, конструкторы базовых классов вызываются, начиная с самого верхнего уровня. После этого выполняются конструкторы тех элементов класса, которые являются объектами, в порядке их объявления в классе, а затем исполняется конструктор класса. Если конструктор базового класса требует указания параметров, он должен быть вызван явным образом в конструкторе производного класса в списке инициализации. Производный класс может вызывать конструктор, определенный в его базовом классе, используя расширенную форму объявления конструктора производного класса и ключевое слово base. С помощью ключевого слова base происходит вызов того конструктора, параметры которого соответствуют переданным при вызове аргументам. Производный класс может определить член, имя которого совпадает с именем члена базового класса. В этом случае член базового класса становится скрытым в производном классе. Для предотвращения предупреждений компилятора перед членом произвольного класса необходимо поставить ключевое слово new. Для доступа к сокрытым членам базового класса используется ключевое слово base. Для создания многоуровневое иерархии один производный класс вполне допустимо использовать в качестве базового для другого производного класса. В подобной ситуации каждый производный класс наследует содержимое всех своих базовых классов. Ссылка base всегда ссылается на конструктор " ближайшего" производного класса. Если в иерархии классов конструктору базового класса требуются параметры, все производные классы должны передавать эти параметры, независимо от того, нужны ли эти параметры самому производному классу. В иерархии классов конструкторы вызываются в порядке выведения классов, т.е. начиная с конструктора базового класса и заканчивая конструктором производного класса. Ключевое слово sealed позволяет описать класс, от которого запрещается наследовать. Особенности наследования демонстрируются в следующей программе:
using System;
class TwoDShape { double pri_width; double pri_height;
// Стандартный конструктор public TwoDShape() { width = height = 0.0; }
// Перегруженный конструктор public TwoDShape(double w, double h) { width = w; height = h; }
// Перегруженный конструктор public TwoDShape(double x) { width = height = x; }
// Свойства для закрытых переменных public double width { get { return pri_width; } set { pri_width = value; } }
public double height { get { return pri_height; } set { pri_height = value; } } // Вывод информации о фигуре public void showDim() {
Console.WriteLine(" Width and height are " + width + " and " + height); } }
// Производный класс от Фигуры class Triangle: TwoDShape { string style;
// Стандартный конструктор public Triangle() { style = " null"; }
// Перегруженный конструктор public Triangle(string s, double w, double h): base(w, h) { style = s; }
// Перегруженный конструктор public Triangle(double x): base(x) { style = " isosceles"; }
// Метод для расчета площади public double area() { return width * height / 2; } // Вывод типа треугольника public void showStyle() { Console.WriteLine(" Triangle is " + style); } }
// Производный класс от треугольника class ColorTriangle: Triangle { string color;
public ColorTriangle(string c, string s, double w, double h): base(s, w, h) { color = c; }
// Вывод цвета на экран public void showColor() { Console.WriteLine(" Color is " + color); } }
class Shapes { public static void Main() { ColorTriangle t1 = new ColorTriangle(" Blue", " right", 8.0, 12.0); ColorTriangle t2 = new ColorTriangle(" Red", " isosceles", 2.0, 2.0);
Console.WriteLine(" Info for t1: "); t1.showStyle(); t1.showDim(); t1.showColor(); Console.WriteLine(" Area is " + t1.area());
Console.WriteLine();
Console.WriteLine(" Info for t2: "); t2.showStyle(); t2.showDim(); t2.showColor(); Console.WriteLine(" Area is " + t2.area()); } }
|