Пример. Порядок вызова конструктора при наследовании

Порядок вызова конструктора при наследовании.

Наследование.

Наследование – это средство для получения новых классов (типов) из сущ классов (типов). Класс, от которого осущ наледование, наз-ся базовым классом или классом родителем, а класс наследник наз-т производным или порожденным классом.

в С# не поддерживается множественное наследование.

class<производный класс >: <базовый класс>

{

// Члены производного класса

}

Члены базового класса, объявленные со спецификацией private не наследуются.Остальные члены базового класса становятся членами производного класса, с теми же спецификациями доступа, что и в базовом классе.

Пример 1.

using System;

namespace Controle

{

class CA

{

protected int x= 5;

public int y = 25;

protected int z;

public int z;

public CA()

{

z = 0;

}

public void put()

{

Console.WriteLine(z);

}

}

classCB: CA // Порождение нового класса

{

public CB()

{

z = x+y;

}

public void put()

{

Console.WriteLine(z);

}

}

class Class1

static void Main (string[] args)

{

CA ob = new CA ();

ob.put();

CB ob1 = new CB();

ob1.put();

}

}

}

Результат: 0, 30;

Предположим, имеются иерархия классов представленная в виде дерева наследования:

class CA
class CВ
class CD


При создании О. производного класса конструктор этого класса, перед выполнением своего кода, всегда вызывает конструктор по умолчанию базового класса, а тот в свою очередь, конструктор по умолчанию класса родителя и т.д. до самого верхнего уровня иерархии. Т.О. всегда вначале работает код конструктора по умолчанию класса СА, затем для классов CB, CDвниз по дереву иерархии. Если в классах родителях присутствует хотя бы один конструктор с аргументами, то конструктор по умолчанию должны быть явно определены во всех род классах. Иначе произойдет ошибка на этапе создания О. производного класса. Т.к. цепочка вызова конструкторов будет нарушена. Дело в том, что компилятор создает конструктор по умолчанию, только в том случае, если не объявлен ни один конструктор в классе. Если необходимо создавать производные классы при помощи наследования, нельзя объявлять конструктор по умолчанию, со спецификацией private. Т.к. этот конструктор запрещает наследование. Такого же эффаекта можно добиться, если запечатать класс (изолировать класс).

Изолированные классы.

Классы от которых запрещено наследовать, наз-ся запечатанными или изолированными классами.

Изолировать класс можно с помощью ключевого слова sealed

sealed class CM

{

int x;

inty;

}

Попытка наследования:

classCA: CМ

{

}

приведет к ошибке трансляции.

Запрещение наследования обычно прим-ся для классов, предназначенных для вып-ся ответственных операций, вмешательства в работы которых недопустимо. К таким классам могут относиться классы для осущ банковских операций или классы, предназначенные для У. в сложном техническом устр-ве.

Сокрытие методов базового класса

Если в производном классе объявить ф-ю с точно таким же заголовком, что и в базовом классе, то говорят, что новый метод сокроет метод базового класса. Для метода, скрывающего метод базового класса, необходимо указать ключевое слово new. Если этого не сделать, то компилятор выдает предупреждение, но ошибки не будет.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: