Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП-Методичка_new.doc
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
354 Кб
Скачать
☆

Лабораторная работа № 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(); }

}

}