Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Отладка программных решений. Учебно-методическое пособие для студентов направлений подготовки бакалавриата 09.03.03 «Прикладная информатика», 09.03.04

.pdf
Скачиваний:
0
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
51
конструктор и через ключевое слово base указать, какой конструктор базового класса должен вызываться (листинги 3.5-3.6).
class BaseClass { private int _field = 1;
public BaseClass(int f) { _field = f; }
public int MethodFirst() { return _field; }
public virtual void MethodSecond() { _field = 5; }
}
Листинг 3.5 – Базовый класс
class ChildClass : BaseClass { public ChildClass(int f) : base(f) { } public ChildClass() : base(10) { }
public new int MethodFirst() { return 10; }
public override void MethodSecond() { base.MethodSecond(); }
}
Листинг 3.6 – Класс-наследник от базового класса
Абстрактный класс отличается от обычного класса тем, что у него есть
методы без логики. Есть только описание, как метод называется, какие параметры он принимает на вход и что возвращает. Такие методы называются абстрактными, как раз по причине отсутствия логики, только абстракция метода. К особенностям таких классов относится еще и то, что от абстрактных классов нельзя создавать объекты. Это обусловлено как раз наличием методов без логики и, если создать объект от абстрактного класса, то при обращении к таким методам будут возникать ошибки. Можно объявлять объекты от
52
абстрактного класса, но инициализировать такой объект можно только наследником от такого класса, у которого будут реализованы все абстрактные методы абстрактного класса (листинги 3.7-3.8).
abstract class AbstractClass { public void Make() { DoWork(); }
protected abstract void DoWork();
public abstract int GetNumber(string text);
}
Листинг 3.7 – Абстрактный класс
class AbstractImplementClass : AbstractClass { public override int GetNumber(string text) { return Convert.ToInt32(text); }
protected override void DoWork() { // some logic }
}
Листинг 3.8 – Класс-наследник от абстрактного класса
Второй тип наследования – реализация. Для работы с таким типом
наследования потребуется интерфейс, в котором описываются возможные действия и класс-реализация интерфейса, в котором все описанные в интерфейсе действия обретают логику. Так как в интерфейсе нет логики, а только описание, то от него, как и от абстрактного класса, нельзя создавать объекты. Отличие интерфейса от абстрактного класса заключается в полном отсутствии логики (никаких полей, методов с логикой), только описание действий (декларация методов). Также в классе-реализации все методы, объявленные в интерфейсы должны быть с модификатором public (т.е. иметь открытый доступ, так как они были объявлены в интерфейсе и подразумевается, что о них знают все). Еще одним ключевым отличием интерфейсов является механизм множественного наследования, когда один класс является реализацией сразу нескольких интерфейсов (единственно, тут
53
может быть проблема, если в реализуемых интерфейсах есть методы с одинаковым названием и передаваемыми параметрами). При этом этот класс (как и любой другой) может наследоваться только от одного абстрактного или базового классов (листинги 3.9-3.11).
interface Interface1 { void Method1();
int Method2();
}
Листинг 3.9 – Интерфейс 1
interface Interface2 { void DoWork();
string Method2();
}
Листинг 3.10 – Интерфейс 2
class ImplementationClass : Interface1, Interface2 { public void DoWork() { // some logic }
public void Method1() { // some logic }
public int Method2() { return 0; }
string Interface2.Method2() { return string.Empty; }
}
Листинг 3.11 – Класс-реализация интерфейсов
Полиморфизм – это свойство, которое позволяет одно и то же имя
использовать для решения двух или более схожих, но технически разных задач. Целью полиморфизма, применительно к объектно-ориентированному программированию, является использование одного имени для задания общих для класса действий. Также это возможность объектов с одинаковой спецификацией иметь различную реализацию.
54
Есть 3 типа полиморфизма:
специализированный полиморфизм; полиморфизм подтипов; параметрический полиморфизм.
Под специализированным полиморфизм понимаются полиморфные
методы (функции), которые могут применяться с различными типами данных. Самый распространенный вариант такого полиморфизма – перегрузка методов, когда в одном классе есть несколько методов с одинаковым именем, но разным набором передаваемых в него параметров (это может быть, как разный тип передаваемых параметров, так и разное количество, а может и комбинация этих двух условий). Но, при этом абсолютно не важен тип возвращаемого методом значения, он не учитывается в механизме перегрузки методов (листинг 3.12).
class MethodOverloadingClass { public void MethodOverload() { }
public void MethodOverload(int a) { }
public void MethodOverload(double a) { }
public void MethodOverload(int a, int b) { }
public void MethodOverload(int a, double b) { }
}
Листинг 3.12 – Перегрузка методов
Для полиморфизма подтипов характерно использование объектов,
опираясь только на его представление (интерфейс), не зная при этом фактического типа. По факту, это означает, что объявляется объект одного типа, но по факту он реализуется объектом другого типа. Самый простой пример – это объявление в коде переменной от абстрактного класса или интерфейса, а инициализация этой переменой уже будет выполняться классом-наследником от абстрактного класса или классом-реализацией интерфейса (да, это никак не противоречит ограничению, что от абстрактного класса или интерфейса нельзя создавать объект, ибо объект создается при инициализации, а не объявлении). Менее явно, когда вместо объекта базового
55
класса принимается объект дочернего класса. Этот механизм работает за счет того, что класс-наследник от базового класса или абстрактного класса может все то, что указано в открытом доступе у абстрактного класса или базового (механизм наследования) и потому, если мы обращаемся через объект к открытым элементам базового или абстрактного класса, то класс-наследник либо имеет такой же доступ, либо знает реализацию (в случае открытых абстрактных методов) вызываемых элементов. Про класс-реализацию интерфейса и подавно не стоит упоминать, ибо там все методы, описанные в интерфейсе в классе-реализации должны иметь открытый доступ (листинг
3.13).
BaseClass bCl = new ChildClass();
AbstractClass aCl = new AbstractImplementClass();
Interface1 int1 = new ImplementationClass();
Листинг 3.13 – Полиморфизм подтипов
Параметрический полиморфизм позволяет определить метод или тип
данных обобщенно, так что значения обрабатываются идентично вне зависимости от их типа. Параметрическим может быть метод или целый класс. В таком случае, вместо конкретного типа указывается параметр в угловых скобках ‘<’ и ’>’. В методе такой параметр можно использовать для задачи типа передаваемых в метод параметров, а в классе, например, для создания полей от параметра. Далее, при вызове метода или создания объекта от такого класса следует указывать (либо, для методов допустима автоматическое определение) вместо параметра конкретный тип. Как только указан тип, генерируется отдельный метод/класс под указанный тип вместо параметра. Поэтому такие методы/классы также называются generic. На параметр можно наложит ограничения, например, чтобы это был ссылочный или обычный тип, или чтобы у параметра был конструктор с пустыми передаваемыми параметрами, или был наследником какого-либо интерфейса/абстрактного класса/обычного класса. В таком случае, в параметризованном методе/классе расширяются действия, выполняемые над элементами, созданными от
56
параметра. Обратной стороной такого ограничения является сужение возможных типов, которые можно поставить вместо параметра при вызове параметризованного метода/создания объекта от параметризованного класса (листинги 3.14-3.16).
class GenericMethodClass { public T Method1<T>() where T: new() { return new T(); }
public T Change<T>(T par1, T par2) { T temp = par1; par1 = par2; par2 = temp;
return temp; }
}
Листинг 3.14 – Параметрический метод
class GenericClass<T> { private T[] _mas;
public GenericClass(int size) { _mas = new T[size]; }
public void Insert(T param, int pos) { if (pos > -1 && pos < _mas.Length) { _mas[pos] = param; } }
public T Get(int pos) { if (pos > -1 && pos < _mas.Length) { return _mas[pos]; } return default(T); }
}
Листинг 3.15 – Параметрический класс
var gmCl = new GenericMethodClass();
int d = gmCl.Change(10, 15);
var newCl = gmCl.Method1<ImplementationClass>();
var gCL1 = new GenericClass<int>(5);
57
var gCl2 = new GenericClass<ImplementationClass>(10);
Листинг 3.16 – Вызов параметрических методов и создание объектов от
параметрического класса
Общее задание
1. Требуется сделать desktop-приложение по реализации
механизмов ООП. Необходимо реализовать следующее:
а. На форме разместить элемент TabControl и добавить
туда 3 вкладки (по количеству заданий, одна вкладка под одно задание).
б. В первой вкладке реализуется первое задание. На вкладке
добавить элементы, через которые можно ввести значения
для полей объекта класса (по варианту). Добавить кнопку,
при нажатии которой создается новый объект класса, на
основе значений, введенных в элементы вкладки, и готовый
объект добавляется в список. Предусмотреть возможность вывода списка объектов (ListBox) на вкладке по нажатию отдельной кнопки.
в. Во второй вкладке реализуется второе задание. На вкладке
добавить элементы, через которые можно ввести значения для полей объекта каждого из классов (по варианту). Добавить кнопки, при нажатии на которые создаются новые объекты каждого класса (каждая кнопка создает объект от своего класса) и готовые объекты добавляются
в список. Предусмотреть возможность прорисовки списка объектов (PictureBox) на вкладке по нажатию отдельной кнопки (координаты объектов задаются рандомно при создании объектов).
58
г. В третьей вкладке реализуется третье задание. На вкладке
добавить элементы, через которые можно ввести значения
для работы методов классов (по варианту). Добавить
кнопку, при нажатии на которую будет вычисляться значение.
д. Обязательно! Программа должна корректно
отрабатывать случаи недостаточности данных для выполнения задания.
е. Каждое задание разбито на 3 части по уровню сложности:
первые 4 задачи на «3», следующие 4 задачи на «4» и
последние 4 задачи на «5». Студент сам выбирает
сложность задачи (но, номер конкретной задачи будет
выдавать преподаватель). Оценка студента по этой
работе будет складываться как среднеарифметическое по каждому заданию.
Задание 1. Инкапсуляция.
1. Класс, описывающий предмет – стул. Имеет несколько открытых полей
(какие именно, продумать самостоятельно).
2. Класс, описывающий предмет – стол. Имеет несколько открытых полей
(какие именно, продумать самостоятельно).
3. Класс, описывающий предмет – диван. Имеет несколько открытых
полей (какие именно, продумать самостоятельно).
4. Класс, описывающий предмет – кровать. Имеет несколько открытых
полей (какие именно, продумать самостоятельно).
======================================================
5. Класс, описывающий предмет – стул. Имеет несколько закрытых полей
(какие именно, продумать самостоятельно) и открытых методов для заполнения полей (по методу на каждое поле, а также продумать
59
проверки на корректность передаваемых данных) и получение значения из полей (также по методу на поле).
6. Класс, описывающий предмет – стол. Имеет несколько закрытых полей
(какие именно, продумать самостоятельно) и открытых методов для заполнения полей (по методу на каждое поле, а также продумать проверки на корректность передаваемых данных) и получение значения из полей (также по методу на поле).
7. Класс, описывающий предмет – диван. Имеет несколько закрытых полей
(какие именно, продумать самостоятельно) и открытых методов для заполнения полей (по методу на каждое поле, а также продумать проверки на корректность передаваемых данных) и получение значения из полей (также по методу на поле).
8. Класс, описывающий предмет – кровать. Имеет несколько закрытых
полей (какие именно, продумать самостоятельно) и открытых методов для заполнения полей (по методу на каждое поле, а также продумать проверки на корректность передаваемых данных) и получение значения из полей (также по методу на поле).
======================================================
9. Класс, описывающий предмет – стул. Имеет несколько закрытых полей
(какие именно, продумать самостоятельно) и открытых свойств для заполнения полей (по свойству на каждое поле, а также продумать проверки на корректность передаваемых данных) и получение значения из полей.
10. Класс, описывающий предмет – стол. Имеет несколько закрытых полей
(какие именно, продумать самостоятельно) и открытых свойств для заполнения полей (по свойству на каждое поле, а также продумать проверки на корректность передаваемых данных) и получение значения из полей.
11. Класс, описывающий предмет – диван. Имеет несколько закрытых полей
(какие именно, продумать самостоятельно) и открытых свойств для
60
заполнения полей (по свойству на каждое поле, а также продумать проверки на корректность передаваемых данных) и получение значения из полей.
12. Класс, описывающий предмет – кровать. Имеет несколько закрытых
полей (какие именно, продумать самостоятельно) и открытых свойств для заполнения полей (по свойству на каждое поле, а также продумать проверки на корректность передаваемых данных) и получение значения из полей.
Задание 2. Наследование.
1. Основной класс – прямоугольник (размеры задаются пользователем).
Дочерний класс – прямоугольник с вписанным в него закрашенным овалом (цвет задается пользователем).
2. Основной класс – квадрат (размеры задаются пользователем). Дочерний
класс – квадрат с вписанным в него закрашенным кругом (цвет задается пользователем).
3. Основной класс – овал (размеры задаются пользователем). Дочерний
класс – овал с вписанным в него закрашенным прямоугольником (цвет задается пользователем).
4. Основной класс – круг (размеры задаются пользователем). Дочерний
класс – круг с вписанным в него закрашенным квадратом (цвет задается пользователем).
======================================================
5. Абстрактный класс – фигура с функцией прорисовки (параметры
задаются пользователем). Реализации: квадрат, закрашенный овал.
6. Абстрактный класс – фигура с функцией прорисовки (параметры
задаются пользователем). Реализации: прямоугольник, закрашенный круг.
7. Абстрактный класс – фигура с функцией прорисовки (параметры
задаются пользователем). Реализации: овал, закрашенный квадрат.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]