- •Введение
- •Лабораторная работа № 1 Создание классов
- •2. Общие сведения
- •3. Постановка задачи
- •4. Порядок выполнения работы
- •5. Содержание отчета
- •Лабораторная работа № 2 Создание объектов
- •2. Общие сведения
- •Лабораторная работа № 3 Наследование, скрытие полей класса и виртуальные методы
- •3. Постановка задачи
- •4. Порядок выполнения работы
- •5. Содержание отчета
- •Лабораторная работа № 4 Использование классов для работы с массивами данных
- •2. Общие сведения
- •Лабораторная работа № 5 Сохранение текущего состояния объектов в файлах
- •3. Постановка задачи
- •4. Порядок выполнения работы
- •5. Содержание отчета
- •Лабораторная работа № 6 Сортировка элементов массива
- •2. Общие сведения
- •3. Постановка задачи
- •4. Порядок выполнения работы
- •5. Содержание отчета
- •6. Контрольные вопросы
- •Рекомендуемые источники
- •423810, Г. Набережные Челны, Новый город, проспект Мира, 68/19
Лабораторная работа № 3 Наследование, скрытие полей класса и виртуальные методы
1. Цель работы. Получение навыков в разработке программ с использованием классов образованных от других классов.
2. Общие сведения
Важнейшая характеристика класса — возможность создания на его основе новых классов с наследованием всех его свойств и методов и добавлением собственных. Наследование позволяет создавать новые классы, повторно используя уже готовый исходный код и не тратя времени на его переписывание.
Наследование — это отношение, связывающее классы, один из которых является базовым и называется родительским, а другой создается на его основе и называется наследником. Наследование заключается в том, что класс-наследник приобретает все свойства и методы родительского класс и добавляет к ним собственные.
Например, описан класс queue1, наследующий описание класса queue:
using System;
{ class queue1 : queue
{ }
}
В ходе наследования новые классы наследуют поля и методы всех родительских классов, вышестоящих по иерархии наследования. Одни из этих полей и методов могут быть замены на собственные, другие могут представлять собой точные копии родительских. В класс-наследник автоматически включаются все поля наследуемого класса. Поля и другие элементы в классе-наследнике могут переопределяться (скрываться) другими элементами.
Скрытие (переопределение) элементов класса — это явное описание в классе наследнике с новыми характеристиками уже существующих элементов из наследуемого класса.
Следующий пример иллюстрирует переопределение в классе queue1, наследуемому от класса queue, полей q и arrchar с невидимых в видимые и присвоению им новых значений, а также введение в класс queue1 новой переменной r.
using System;
namespace Project3
{
class queue
{ private int q=50;
private char[] arrchar= new char[4] {'a','b','c','d'};
public int p;
public char ch;
}
class queue1 : queue
{ private int r = 50;
public new int q=50;
public new char[] arrchar= new char[4] {'e','f','g','h'};
public queue1() {}
public queue1(int q, int i)
{ p = q*r;
ch = arrchar[i]; }
}
class Executer
{
static void Main()
{
//В переменную a наследуемого класса записывают экземпляр класса-наследника:
queue a = new queue1(500,1);
// Создание объекта b класса queue1
queue1 b = new queue1(50,2);
Console.WriteLine(a.p);
Console.WriteLine(a.ch);
Console.WriteLine(b.p);
Console.WriteLine(b.ch);
Console.ReadLine();
}
} }
В языке C#, в соответствии с принципами полиморфизма, поддерживается принцип совместимости объектов по цепочке наследуемых классов. Так экземпляр любого из нижестоящих по иерархии наследования классов может быть присвоен переменной, описанной как один из вышестоящих классов. C# также поддерживает и обратную возможность.
Очень интересной возможностью классов, позволяющей родительскому классу обращаться к методам своих наследников, является виртуализация методов. Для этого замещаемый метод родителя объявляется с квалификатором virtual. Встретив это слово, компилятор создаст таблицу виртуальных методов, в которую поместит их названия и адреса точек входа. Класс-наследник объявляет замещающий метод с квалификатором override. На этапе выполнения программы при обращении любого родительского класса к замещенному в таблицу виртуальных методов помещается ссылка на соответствующий метод наследника, который и работает так, как если бы он изначально был частью родительского класса.
Следующий пример иллюстрирует данную возможность.
using System;
namespace Project3a
{ class Roditel
{ public virtual string GetStr() {return "Родитель";}
public void Test() {Console.WriteLine(GetStr());}
}
class Naslednik : Roditel
{ public override string GetStr() {return "Наследник";}
}
class Executer
{ static void Main()
{ Roditel A = new Roditel();
Naslednik B = new Naslednik();
A.Test(); // Вывод: Родитель
B.Test(); // Вывод: Наследник
Console.ReadLine(); }
}
}
