ОТЧЕТ
По лабораторной работе
по дисциплине «Алгоритмизация и программирование»
Студент: А.С.Блинков
Группа НМт-263907
Преподаватель:
профессор, д.т.н. И.А.Гурин
Екатеринбург
Практическая работа «Введение в ООП и.NETFramework»
1. Создать консольное приложение C#.
2. Вычислить числа Фибоначчи, используя (по вариантам):
Вариант 3.ЦиклDo-while с 1 до 10
classProgram
{
staticvoid Main(string[] args)
{
int a = 1;
int b = 0;
int sum = 0;
intnumber = 1;
Console.WriteLine("Программа выводит числа Фибоначчи от 1 до 10");
do
{
if (number > 10)
{
break;
}
sum = a + b;
Console.Write("{0} ", sum);
a = b;
b = sum;
number++;
}
while (number >= sum);
Console.ReadKey();
}
}
3. Спроектировать набор классов и методов предметной области, показывающий основные принципы ООП – наследование, полиморфизм, инкапсуляция.
Продемонстрировать работу (через создание объектов).
В данной работе я использовал 1 базовый класс – Автомобили и 2 подкласса- Легковые автомобили и Грузовые автомобили.
· Наследование:
После двоеточия указываем базовый класс для данного класса. Для классов Passege и Trucks базовым является Car, и поэтому классы классыPassege и Trucks наследует все те же свойства, методы, поля, которые есть в классе Car. Единственное, что не передается при наследовании, это конструкторы базового класса.
classTrucks:Car
classPasseger:Car
С помощью ключевого слова base можно обратиться к базовому классу. В конструкторе класса Passege надо установить марку, вес, модель, год выпуска и количество пассажирских мест, а в классе Trucks надо установить марку, вес, модель, год выпуска, мощность двигателя и значение грузоподъемности. Но марку, модель, вес, и год передаем на установку в конструктор базового класса, то есть в конструктор класса Car, с помощью выражения
: base(_marka, _model, _Year, _weight).
В классе Passege и Trucks через ключевое слово base надо явным образом вызвать конструктор класса Car:
Для Passege:
public intnumber_seats{ get; set; }
public Passeger(string _marka, string _model, int _Year, int _weight, intnumb_seats)
: base(_marka, _model, _Year, _weight)
{
number_seats = numb_seats;
}
Для Trucks:
public Trucks(string _marka, string _model, int _Year, int _weight, inteng_power, intlift_capacity)
: base(_marka, _model, _Year, _weight)
{
lifting_capacity = lift_capacity;
engine_power = eng_power;
}
При создании производного класса надо учитывать тип доступа к базовому классу - тип доступа к производному классу должен быть таким же, как и у базового класса, или более строгим. То есть, если базовый класс у нас имеет тип доступа internal, то производный класс может иметь тип доступа internal или private, но не public.
· Инкапсуляция:
Применение модификаторов доступа типа private защищает переменную от внешнего доступа.
privateintyear;
Инкапсуляция применяется для ограничения доступа к переменной year и сокрытию ее внутри класса.
privateintyear;
publicint Year
{
set
{
if (value< 0)
{
Console.WriteLine("Некорректныйгодвыпуска!\n");
}
else
{
year = value;
}
}
get
{
return year;
}
}
· Полиморфизм:
Полиморфизм предполагает определение полиморфного интерфейса в базовом классе - набор членов класса, которые могут быть переопределены в классе-наследнике.
Методы, которые мы хотим сделать доступными для переопределения, в базовом классе помечается модификатором virtual.
В данной лабораторной работе, для наглядности, я использовал 3 различных метода:
1. Обычное наследование всех членов базового класса в классе-наследнике
Минусом данного метода является то, что переопределены будут лишь те элементы, которые указаны в данном методе:
publicvirtualvoidInfoCarVirtual()
{
Console.WriteLine("Марка автомобиля: " + marka + "\n" + "Модель автомобиля: " + model + "\n" + "Вес автомобиля: " + weight + "\n" + "Год выпуска автомобиля: " + Year + "\n");
}
Car avto2 = newCar("Toyota", "Land Cruiser 200", 2015, 2555);
avto2.InfoCarVirtual();
Passegeravto = newPasseger("BMW", "X6M", 2017, 2150, 5);
avto.InfoCarVirtual();
В данном случае будут выведены данные:
"Toyota", "LandCruiser 200", 2015, 2555
"BMW", "X6M", 2017, 2150
Число 5 в экземпляре avto выведено не будет.
2. Переопределение членов базового класса в классе-наследнике
Я считаю, что самым оптимальным способом переопределения в данной работе, является именно этот способ:
Переопределение методов базового класса в классе-наследнике предполагает использование ключевого слова override:
publicoverridevoidInfoCarVirtual()
{
Console.WriteLine("Марка автомобиля: " + marka + "\n" + "Модель автомобиля: " + model + "\n" + "Вес автомобиля: " + weight + "\n" + "Год выпуска автомобиля: " + Year + "\n" + "В автомобиле: " + number_seats + " пассажирских мест\n");
}
Напримереэкземпляров:
Car avto2 = newCar("Toyota", "Land Cruiser 200", 2015, 2555);
avto2.InfoCarVirtual();
Passegeravto = newPasseger("BMW", "X6M", 2017, 2150, 5);
avto.InfoCarVirtual();
Будут выведены все значения, а именно:
"Toyota", "Land Cruiser 200", 2015, 2555
"BMW", "X6M", 2017, 2150, 5
Число 5 будет выведено, в отличии от предыдущего метода.
3. Скрытие членов базового класса в классе-наследнике
Можно определить в классе-наследнике метод с тем же именем, добавив в определение ключевое слово new.
В данном случае будем скрывать значения в avto3, а именно значения 180 и 2000.
Car avto3 = newTrucks("Iveco EuroTrakker", "AD 720 T", 2009, 9000, 180, 2000); //180 и 2000 показанонебудет
avto3.InfoCarVirtual();
Trucks avto4 = newTrucks("Volvo", "FL", 2017, 12000, 240, 6000); //240 и 6000 будетпоказано
avto4.InfoCarVirtual();
Нужно заметить, что в экземпляре, в отличии от других 2 способов по разные стороны “=” записаны разные классы, а именно Car и Trucks (Caravto3 = newTrucks)
publicnewvoidInfoCarVirtual()
{
Console.WriteLine("Маркаавтомобиля: " + marka + "\n" + "Модельавтомобиля: " + model + "\n" + "Весавтомобиля: " + weight + "\n" + "Годвыпускаавтомобиля: " + Year + "\n" + "Мощностьдвигателя: " + engine_power + "\n" + "Грузоподъемность: " + lifting_capacity + "\n");
}
Полный код программы:
using System;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Threading.Tasks;
namespace ConsoleApp34
{
classCar
{
publicstringmarka{ get; set; }
publicstring model { get; set; }
publicint weight { get; set; }
privateint year;
publicint Year
{
set
{
if (value< 0)
{
Console.WriteLine("Некорректный год выпуска!\n");
}
else
{
year = value;
}
}
get
{
return year;
}
}
publicCar(string _marka, string _model, int _weight, int _Year)
{
marka = _marka;
weight = _weight;
model = _model;
Year = _Year;
}
//Методы, которые мы хотим сделать доступными для переопределения, в базовом классе помечается модификатором virtual
publicvirtualvoidInfoCarVirtual()
{
Console.WriteLine("Марка автомобиля: " + marka + "\n" + "Модель автомобиля: " + model + "\n" + "Вес автомобиля: " + weight + "\n" + "Год выпуска автомобиля: " + Year + "\n");
}
}
classPasseger:Car
{
publicintnumber_seats{ get; set; }
publicPasseger(string _marka, string _model, int _Year, int _weight, intnumb_seats)
: base(_marka, _model, _Year, _weight)
{
number_seats = numb_seats;
}
//Переопределение методов базового класса в классе-наследнике при помощи override
publicoverridevoidInfoCarVirtual()
{
Console.WriteLine("Марка автомобиля: " + marka + "\n" + "Модель автомобиля: " + model + "\n" + "Вес автомобиля: " + weight + "\n" + "Год выпуска автомобиля: " + Year + "\n" + "В автомобиле: " + number_seats + " пассажирских мест\n");
}
}
classTrucks:Car
{
publicintlifting_capacity{ get; set; }
publicintengine_power{ get; set; }
publicTrucks(string _marka, string _model, int _Year, int _weight, inteng_power, intlift_capacity)
: base(_marka, _model, _Year, _weight)
{
lifting_capacity = lift_capacity;
engine_power = eng_power;
}
//Переопределение методов базового класса в классе-наследнике при помощи new
//Чтобы явно скрыть метод из базового класса, используется ключевое слово new
publicnewvoidInfoCarVirtual()
{
Console.WriteLine("Марка автомобиля: " + marka + "\n" + "Модель автомобиля: " + model + "\n" + "Вес автомобиля: " + weight + "\n" + "Год выпуска автомобиля: " + Year + "\n" + "Мощность двигателя: " + engine_power + "\n" + "Грузоподъемность: " + lifting_capacity + "\n");
}
}
classProgram
{
staticvoid Main(string[] args)
{
//Переопределение методов базового класса в классе-наследнике при помощи override:
Car avto2 = newCar("Toyota", "Land Cruiser 200", 2015, 2555);
avto2.InfoCarVirtual();
Console.WriteLine("Легковыемашины: \n");
Passegeravto = newPasseger("BMW", "X6M", 2017, 2150, 5);
avto.InfoCarVirtual();
//Переопределение методов базового класса в классе-наследнике при помощи new:
//В этом случае метод InfoCarVirtual() в Trucks скрывает метод InfoCarVirtual() из класса Car
//Разница в объявлении экземпляра
Console.WriteLine("Грузовые машины:\n");
Car avto3 = newTrucks("Iveco EuroTrakker", "AD 720 T", 2009, 9000, 180, 2000); //180 и 2000 показанонебудет
avto3.InfoCarVirtual();
Trucks avto4 = newTrucks("Volvo", "FL", 2017, 12000, 240, 6000); //240 и 6000 будетпоказано
avto4.InfoCarVirtual();
Console.ReadKey();
}
}
}