Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Основные сведения. Особенности наследования в 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());

}

}







© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.