ЛР04 !новая! Создание и использование классов

advertisement
Лабораторная работа 3.
Создание и использование классов.
Долгое время процедуры и функции играли не только функциональную, но и
архитектурную роль. Но с появлением ООП архитектурная роль процедур и функций
отошла на второй план. Для ОО-языков, к которым относится и язык C#, в роли
архитектурного модуля выступает класс.
Процедуры и функции связываются теперь с классом, они обеспечивают
функциональность данных класса и называются методами класса. Главную роль в
программной системе играют данные, а функции лишь служат данным. В C# процедуры и
функции существуют только как методы некоторого класса, они не существуют вне
класса.
Рассмотрим синтаксис объявления класса в языке C# на примере:
//здесь мы объявляем класс Person
public class Person
{
//можно использовать следующие модификаторы доступа:
//public - доступность для любых классов
//private – доступность только внутри методов самого класса
//protected - доступность также внутри методов производных классов
//internal - доступность также внутри методов классов из одного проекта
//объявляем поля (все закрыты)
protected string _name = "";
protected int _age = 0;
//объявляем методы-свойства для доступа к полям
//get - для чтения поля
//set - для записи в поле
//value - так обозначается значение,
//
которое должно быть присвоено методу-свойству
public string Name
{
get { return _name; }
set
{
if (value != "") _name = value;
}
}
public int Age
{
get { return _age; }
set { if (value > 0) _age = value; }
}
//конструктор класса
public Person()
{
Console.WriteLine("Кто-то пришел.");
}
//переписав объявление конструктора таким образом:
// static Person()
// {
//
Console.WriteLine("Статический конструктор.");
// }
//получим конструктор, который быдет вызываться только один раз
//перед созданием первого объекта данного класса
//методы класса, объявленные с модификатором static
//могут быть вызваны без создания объекта класса,
//а напрямую через его имя
//еще один конструктор (перегруженный)
public Person(string name, int age)
{
//this – ссылка на объект класса в котором вызван метод
this._name = name;
//допустима и такая запись (эквивалентно this._age)
_age = age;
}
//закрытый виртуальный метод
//производный класс может иметь свою реализацию этого метода
protected virtual string GetStatus()
{
if (_age < 7) return "ребенок";
else if (_age < 17) return "школьник";
else if (_age < 22) return "студент";
else return "служащий";
}
//открытый метод Say
public void Say()
{
Console.WriteLine("{0}: Меня зовут {0}, мне {1}, я – {2}.",
_name, _age.ToString(), GetStatus());
}
//открытый метод Say (перегруженный)
public void Say(string phrase)
{
Console.WriteLine("{0}: {1}", _name, phrase);
}
//деструктор
~Person()
{
Console.WriteLine("Кто-то ушел.");
Console.ReadLine();
}
}
Наследование классов
Далее следует пример наследования классов в языке C#. Класс-потомок наследует все
возможности родительского класса - все поля и все методы, открытую и закрытую часть
класса. Правда, не ко всем полям и методам класса возможен прямой доступ потомка.
Поля и методы родительского класса, снабженные атрибутом private, хотя и
наследуются, но по-прежнему остаются закрытыми, и методы, создаваемые потомком, не
могут к ним обращаться напрямую, а только через методы, наследованные от родителя.
Единственное, что не наследует потомок - это конструкторы родительского класса.
//объявляем класс Male, производный от класса Person
public class Male : Person
{
//здесь в конструкторе класса Male происходит вызов
//конструктора базового класса Person
public Male(string name, int age) : base(name, age)
{
Console.WriteLine("Пришел " + _name + ".");
}
//деструктор
~Male()
{
Console.WriteLine("Ушел " + _name + ".");
Console.ReadLine();
}
}
//объявляем класс Female, производный от класса Person
public class Female : Person
{
//вызываем конструктор базового класса и передаем ему параметры
public Female(string name, int age) : base(name, age)
{
Console.WriteLine("Пришла " + _name + ".");
}
//здесь реализуем метод, объявленный в базовом классе
//как виртуальный - используется модификатор override
protected override string GetStatus()
{
if (_age < 7) return "ребенок";
else if (_age < 17) return "школьница";
else if (_age < 22) return "студентка";
else return "служащая";
}
//метод потомка, скрывающий метод родителя, следует
//сопровождать модификатором new, указывающим на новый метод:
//
new public void Say()
//
{
//
Console.WriteLine("{0}: Меня зовут {0}, я – {2}.",
//
_name, _age.ToString(), GetStatus());
//
}
//деструктор
~Female()
{
Console.WriteLine("Ушла " + _name + ".");
Console.ReadLine();
}
}
Методы класса могут быть объявлены как абстрактные. Это означает, что в этом классе
нет реализации этих методов. Абстрактные методы пишутся с модификатором abstract.
Класс, в котором есть хотя бы один абстрактный метод, называется абстрактным (а таком
классе могу быть и обычные методы). Нельзя создавать экземпляры абстрактного класса такой класс может использоваться только в качестве базового класса для других классов.
Для потомка такого класса есть две возможности - или он реализует все абстрактные
методы базового класса (и в этом случае для такого класса-потомка мы сможем создавать
его экземпляры), или он реализует не все абстрактные методы базового класса (в этом
случае он является тоже абстрактным классом и единственная возможность его
использования - это производить от него классы-потомки). Пример:
abstract class Figure
{
//Площадь фигуры
public abstract double square();
//Периметр фигуры
public abstract double perimeter();
}
class Triangle: Figure
{
double a, b, c; //Стороны
//Конструктор
public Triangle(double a, double b, double c)
{
this.a=a;
this.b=b;
this.c=c;
}
public override double square()
{
//Используем формулу Герона
double p = (a+b+c)/2;
return Math.Sqrt(p*(p-a)*(p-b)*(p-c));
}
public override double perimeter()
{
return a+b+c;
}
}
Основное назначение абстрактных классов - быть предками для других классов. На
другом конце иерархии стоят так называемые sealed-классы. От них нельзя производить
дочерние классы. Синтаксис для них такой же, как и для обычных классов, за
исключением ключевого слова sealed. Пример:
...
sealed class MyClass
{
//Методы и переменные класса
int x;
...
}
class MyClass2: MyClass //Ошибка!
{
...
}
...
Следует отметить, что в C# класс не может быть объявлен производным от нескольких
классов. То есть отсутствует полное множественное наследование классов. Чтобы
частично сгладить этот пробел, допускается множественное наследование интерфейсов.
Обеспечить возможность классу иметь несколько родителей - один полноценный класс, а
остальные в виде интерфейсов, - в этом и состоит основное назначение интерфейсов.
Интерфейс представляет собой полностью абстрактный класс, все методы которого
абстрактны. От абстрактного класса интерфейс отличается некоторыми деталями в
синтаксисе и поведении. Синтаксическое отличие состоит в том, что методы интерфейса
объявляются без указания модификатора доступа. Отличие в поведении заключается в
более жестких требованиях к потомкам. Класс, наследующий интерфейс, обязан
полностью реализовать все методы интерфейса. В этом - отличие от класса,
наследующего абстрактный класс, где потомок может реализовать лишь некоторые
методы родительского абстрактного класса, оставаясь абстрактным классом.
Отметим одно важное назначение интерфейсов. Интерфейс позволяет описывать
некоторые желательные свойства, которыми могут обладать объекты разных классов. В
библиотеке FCL имеется большое число подобных интерфейсов. Пример интерфейса:
public interface IPerson
{
void Say();
void Say(string phrase);
string GetStatus();
}
Диаграммы классов
Среда разработки позволяет создавать диаграммы классов, на которых отражаются их
поля, методы и отношения наследования. Чтобы создать диаграмму классов в главном
меню откройте раздел «Project» и щелкните пункт «Add New Item…».
Появится диалог выбора шаблонов объектов, которые можно добавить в проект. Нужно
выбрать шаблон «Class Diagram», задать имя для диаграммы и нажать кнопку «Add».
Диаграмма классов с заданным именем будет добавлена в проект, и будет отображаться во
вкладке «Solution Explorer». Добавить на диаграмму существующий класс можно
перетащив его из вкладки «Classes View» на рабочее поле диаграммы. Диаграмма классов
позволяет не только наглядно представить классы, но также создавать и редактировать их.
Чтобы создать новый класс и отобразить его на диаграмме воспользуйтесь контекстным
меню (правая кнопка мышки на свободном рабочем поле диаграммы).
Контекстное меню класса (правая кнопка мышки на классе) позволяет добавлять новые
методы, свойства, события, конструкторы класса и т.д.
Индивидуальные задания:
Задание 1
Составить консольное приложение, которое содержит описание класса Time (время),
который должен содержать:
Класс должен включать:
 Закрытые поля для хранения часов, минут и секунд
 Свойства для доступа к полям
 Конструктор или несколько конструкторов, для создания объектов
 Метод - показать на экране время в формате (чч:мм:сс)
 Метод - рассчитать разницу в секундах с заданным временем
public int Razn(Time t) { … }
Что сделать:
1.
2.
3.
4.
В функции Main() нужно объявить массив из 3 объектов класса
Задать им следующие значения (2ч 30м 10с, 5ч 15м 25с, 3ч 45м 11с)
Вывести на экран время, хранящееся во всех объектах.
Рассчитать разницу в днях между 1 и 2 объектами и вывести ее на экран.
Задание 2
Составить консольную программу, которая содержит описание класса Date - дата (год,
месяц, день)
Класс должен включать:
 Закрытые поля для хранения года, месяца, дня
 Свойства для доступа к полям
 Конструктор или несколько конструкторов, для создания объектов
 Метод - показать на экране время в формате (дд/мм/гг)
 Метод - рассчитать количество дней с начала года до даты
public int Days( )
Что сделать:
1.
2.
3.
4.
В функции Main() нужно объявит массив из 3 объектов класса
Задать им следующие значения (1.5.2001 5.2.2002 13.7.2001)
Вывести на экран даты, хранящиеся во всех объектах.
Рассчитать разницу в днях между 1 и 3 объектами и вывести ее на экран.
Задание 3
Составить консольную программу, которая содержит описание класса Box - ящик (высота,
ширина, длина)
Класс должен включать:
 Закрытые поля для хранения данных о высоте, ширине, длине
 Конструктор или несколько конструкторов, для создания объектов
 Метод - показать на экране данные о ящике
 Метод - рассчитать объем коробки
public float Volume( )
Что сделать:
1. В функции Main() нужно объявит массив из 3 объектов класса
2. Задать им следующие значениями высоты, ширины и длины ((2,3,5), (6,7,2),
(3,5,4))
3. Вывести на экран данные, хранящиеся во всех объектах.
4. Рассчитать в цикле суммарный объем коробок и вывести его на экран
Задание 4
Составить консольную программу, которая содержит описание класса Fraction – дробь
(числитель, знаменатель)
Класс должен включать:
 Закрытые поля для хранения данных о числителе и знаменателе
 Конструктор или несколько конструкторов, для создания объектов
 Метод - показать на экране данные о дроби в формате
числитель/знаменатель

Метод – сложение с другим объектом данного класса
public Fraction Sum(Fraction b) { … }
Что сделать:
1.
2.
3.
4.
В функции Main() нужно объявит массив из 3 объектов класса
Задать им следующие значения - (1/2), (1/3), (2/3)
Вывести на экран данные, хранящиеся во всех объектах.
Рассчитать сумму всех дробей, используя метод Sum, вывести результат
на экран
Задание 5
Составить программу, которая содержит описание класса Complex – комплексные числа
(реальная часть, мнимая часть)
Класс должен включать:
 Закрытые поля для хранения данных о реальной часть и мнимой части
 Конструктор или несколько конструкторов, для создания объектов
 Метод - показать на экране данные о комплексном числе в формате (r + i m)
(r- реальная часть, m – мнимая часть)
Метод – сложение с другим объектом данного класса
public float Sum(Complex b) {…}
Что сделать:
1. В функции Main() нужно объявит массив из 3 объектов класса.
2. Задать им следующие значения (высота, ширина, длина) - (1 + i2), (2 +
i3), (3 + i4)
3. Вывести на экран данные, хранящиеся во всех объектах.
4. Рассчитать в цикле сумму этих комплексных чисел и вывести ее на экран
Задание 6
Составить консольное приложение, содержащее описание класса Student (студент),
который должен включать:
 Закрытые поля для хранения имени и отметки
 Свойства для доступа к закрытым полям
 Конструктор или несколько конструкторов, для создания объектов
 Метод - показать на экране данные о студенте
Что сделать:
1. В функции main() нужно объявит коллекцию
2. Создать 3 объекта класса и добавить их в коллекцию
3. Задать объектам следующие значения - ((Иванов, 3), (Сидоров, 4), (Петров,
5))
4. Вывести на экран данные, хранящиеся во всех объектах.
5. Рассчитать в цикле среднюю оценку студентов и вывести ее на экран
Задание 7
Составить консольное приложение, которое содержит описание класса Employee
(служащий), который должен содержать:




Закрытые поля для хранения имени и зарплаты
Свойства для доступа к закрытым полям
Конструктор или несколько конструкторов, для создания объектов
Метод - показать на экране данные о служащем
Что сделать:
1. В функции Main() нужно объявит коллекцию
2. Создать 3 объекта класса и добавить их в коллекцию
3. Задать объектам следующие значения - ((Иванов, 6350), (Сидоров, 10350),
(Петров, 56350))
4. Вывести на экран данные, хранящиеся во всех объектах.
5. Рассчитать в цикле среднюю зарплату служащих и вывести ее на экран
Задание 8
Составить консольное приложение, которое содержит описание класса Car (автомобиль),
который должен содержать:




Закрытые поля для хранения марки, гос.номер и пробега
Свойства для доступа к закрытым полям
Конструктор или несколько конструкторов, для создания объектов
Метод - показать на экране данные об автомобиле
Что сделать:
1. В функции Main() нужно объявит коллекцию
2. Создать 3 объекта класса и добавить их в коллекцию
3. Задать объектам следующие значения - ((Волга, Н180ТО, 6350), (Жигули,
Т144ТО, 10350), ((Нива, С234ТО, 56350))
4. Вывести на экран данные, хранящиеся во всех объектах.
5. Рассчитать в цикле суммарный пробег всех автомобилей и вывести его на
экран
Задание 9
Составить консольное приложение, которое содержит описание класса Computer
(вычислительная машина), который должен содержать:




Закрытые поля для хранения - инвентарного номера, частоты процессора и
объема жесткого диска
Свойства для доступа к закрытым полям
Конструктор или несколько конструкторов, для создания объектов
Метод - показать на экране данные о компьютере
Что сделать:
1. В функции Main() нужно объявит коллекцию
2. Создать 3 объекта класса и добавить их в коллекцию
3. Задать объектам следующие значения - ((123345, 1 500 000 000, 40 000 000
000), (233745, 1 200 000 000, 10 000 000 000), ((523654, 850 000 000, 1
500 000 000))
4. Вывести на экран данные, хранящиеся во всех объектах.
5. Рассчитать в цикле суммарный объем жестких дисков всех компьютеров и
вывести его на экран
Задание 10
Составить консольное приложение, которое содержит описание класса Rectangle
(прямоугольник), который должен содержать:
Класс должен включать:
 Закрытые поля для хранения высоты и ширины
 Свойства для доступа к полям
 Конструктор или несколько конструкторов, для создания объектов
 Метод - показать на экране размер прямоугольника в формате “(высота :
ширина)”
 Метод - рассчитать площадь прямоугольника
public float Area ( ) { … }
Что сделать:
1.
2.
3.
4.
5.
В функции Main() нужно объявит массив из 3 объектов класса
Создать 3 объекта класса и добавить их в коллекцию
Задать им следующие значения (5,4), (3.5, 4.6) (2.5, 4.8)
Вывести на экран размеры всех прямоугольников.
Рассчитать суммарную площадь всех прямоугольников.
Задание 11
Составить программу, которая содержит описание класса Complex – комплексные числа
(реальная часть, мнимая часть)
Класс должен включать:
 Закрытые поля для хранения данных о реальной часть и мнимой части
 Конструктор или несколько конструкторов, для создания объектов
 Метод - показать на экране данные о комплексном числе в формате (r + i m)
(r- реальная часть, m – мнимая часть)
 Метод – получение модуля комплексного числа
public float Modul ( ) { … }
Что сделать:
1. В функции main() нужно объявит коллекцию
2. Создать 3 объекта класса и добавить их в коллекцию
3. Задать им следующие значения - (1 + i2), (2 + i3), (3 + i4)
4. Вывести на экран данные, хранящиеся во всех объектах.
5. Рассчитать в цикле сумму модулей этих комплексных чисел и вывести ее
на экран
Примечание: модуль комплексного числа (a+ib) равен Math.sqrt (a*a + b*b)
Задание 12
Составить консольную программу, которая содержит описание класса Date - дата (год,
месяц, день)
Класс должен включать:
 Закрытые поля для хранения год, месяц, день
 Свойства для доступа к полям
 Конструктор или несколько конструкторов, для создания объектов
 Метод - показать на экране время в формате (дд/мм/гг)
 Метод - рассчитать количество дней оставшихся от даты до конца года
Public int Days( ) { … }
Что сделать:
1.
2.
3.
4.
5.
В функции Main() нужно объявит коллекцию
Создать 3 объекта класса и добавить их в коллекцию
Задать им следующие значения (1.5.2001 5.2.2001 13.7.2002)
Вывести на экран даты, хранящиеся во всех объектах.
Рассчитать разницу в днях между 1 и 2 объектами и вывести ее на экран.
Download