СДЕЛАЙТЕ СВОИ УРОКИ ЕЩЁ ЭФФЕКТИВНЕЕ, А ЖИЗНЬ СВОБОДНЕЕ

Благодаря готовым учебным материалам для работы в классе и дистанционно

Скидки до 50 % на комплекты
только до

Готовые ключевые этапы урока всегда будут у вас под рукой

Организационный момент

Проверка знаний

Объяснение материала

Закрепление изученного

Итоги урока

Разработка кода ИС Практическая работа №11

Категория: Информатика

Нажмите, чтобы узнать подробности

Просмотр содержимого документа
«Разработка кода ИС Практическая работа №11»

Практическая работа №11

Тема: Реализация наследования

Цель работы: приобрести практические навыки реализации наследования в C#, включая создание базовых и производных классов, переопределение виртуальных методов, сокрытие членов и использование ключевых слов base, virtual, override и new.

Краткие теоретические сведения

Наследование является одним из фундаментальных атрибутов объектно-ориентированного программирования. Оно позволяет определить дочерний класс, который использует (наследует), расширяет или изменяет возможности родительского класса. Класс, члены которого наследуются, называется базовым классом. Класс, который наследует члены базового класса, называется производным классом.

C# и .NET поддерживают только одиночное наследование. Это означает, что каждый класс может наследовать члены только одного класса. Но зато поддерживается транзитивное наследование, которое позволяет определить иерархию наследования для набора типов. Другими словами, тип D может наследовать возможности типа C, который в свою очередь наследует от типа B, который наследует от базового класса A. Благодаря транзитивности наследования члены типа A будут доступны для типа D.

Не все члены базового класса наследуются производными классами. Следующие члены не наследуются.

Статические конструкторы, которые инициализируют статические данные класса.

Конструкторы экземпляров, которые вызываются для создания нового экземпляра класса. Каждый класс должен определять собственные конструкторы.

Методы завершения, которые вызываются сборщиком мусора среды выполнения для уничтожения экземпляров класса.

Все остальные члены базового класса наследуются производными классами, но их видимость не зависит от доступности. Доступность членов влияет на видимость для производных классов следующим образом.

Закрытые члены являются видимыми только в производных классах, которые вложены в базовый класс. Для других производных классов они невидимы. В следующем примере класс A.B является вложенным и производным от A, а C является производным от A. Частное A._value поле отображается в A.B. Однако если удалить комментарии из C.GetValue метода и попытаться скомпилировать пример, возникает ошибка компилятора CS0122: "A._value недоступен из-за уровня защиты".

C#

public class A

{

private int _value = 10;


public class B : A

{

public int GetValue()

{

return _value;

}

}

}


public class C : A

{

// public int GetValue()

// {

// return _value;

// }

}


public class AccessExample

{

public static void Main (string [] args)

{

var b = new A.B();

Console.WriteLine (b.GetValue());

}

}

// The example displays the following output:

// 10

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

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

Открытые члены являются видимыми в производных классах, а также входят в общедоступный интерфейс производных классов. Унаследованные открытые члены можно вызывать так же, как если бы они были определены в самом производном классе. В следующем примере класс A определяет метод с именем Method1, а класс B наследует от класса A. В нашем примере Method1 вызывается так, как если бы это был метод класса B.

C#

public class A

{

public void Method1()

{

// Method implementation.

}

}


public class B : A

{ }


public class Example

{

public static void Main()

{

B b = new ();

b.Method1();

}

}

Производные классы могут также переопределять унаследованные члены, то есть предоставлять альтернативную реализацию. Переопределить можно только те члены, которые в базовом классе отмечены ключевым словом virtual (виртуальный). По умолчанию нельзя переопределять члены базового класса, не отмеченные ключевым словом virtual. Попытка переопределить невиртуалового члена, как показано в следующем примере, приводит к ошибке компилятора CS0506: " не может переопределить наследуемый , так как он не помечен как виртуальный, абстрактный или переопределяемый".

C#

public class A

{

Public void Method1()

{

// Do something.

}

}


public class B : A

{

public override void Method1() // Generates CS0506.

{

// Do something else.

}

}



Задание.

Создать консольное приложение на языке программирования C#

Создать классы: Human (человек), Earth (Земля), Train (поезд) и интерфейс: IMove с методом Move(int deltaT) и свойством Current. Метод Move() моделирует движение с шагом deltaT, свойство Current – показывает текущее положение. Реализовать в классах наследование от интерфейса IMove. Проверить работу классов в методе Main(). Логику движения моделируемых сущностей придумать самостоятельно.

Контрольные вопросы:

  1. Что такое наследование в C#

  2. Какой синтаксис используется для указания базового класса?