- •Оглавление
- •Лабораторная работа №8 Синтаксис интерфейса
- •Реализация интерфейса
- •Работа с объектами через интерфейсы. Операции is и as
- •Интерфейсы и наследование
- •Стандартные интерфейсы .Net
- •Сравнение объектов
- •Сортировка по разным критериям (интерфейс iComparer)
- •Перебор объектов (интерфейс iEnumerable) и итераторы
- •Пространство имен System.Collections
- •Класс ArrayList
- •Индивидуальные задания
- •Вариант 0
- •Вариант 1
- •Вариант 2
- •Вариант 3
- •Вариант 4
- •Вариант 5-20
- •Пример выполнения варианта №0
Пример выполнения варианта №0
Задание 1
Создать абстрактный класс Vehicle (транспортное средство). На его основе реализовать классы Plane (самолет), Car (автомобиль) и Ship (корабль). Классы должны иметь возможность задавать и получать параметры средств передвижения (цена, скорость, и т. п.) с помощью свойств. Для самолета должна быть определена высота, для самолета и корабля – количество пассажиров, для корабля – порт приписки.
Для хранения разработанных классов использовать стандартные параметризованные коллекции. Во всех классах реализовать интерфейс IComparable и перегрузить операции отношения для реализации значимой семантики сравнения объектов по какому-либо полю на усмотрение студента.
Листинг 8.9. – Задание 1
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
namespace lr8
{
abstract class Vehicle: IComparable
{
private int cost;
private string model;
public Vehicle(string model, int cost)
{
this.model = model;
this.cost = cost;
}
public int CompareTo(object obj)
{
string s1 = obj.GetType().Name;
string s2 = ((object)this).GetType().Name;
return string.Compare(s1, s2);
}
public abstract void Passport();
public int Cost
{
get
{
return cost;
}
set
{
cost = value;
}
}
public string Model
{
get
{
return model;
}
set
{
model = value;
}
}
}
class Plane : Vehicle, IComparable
{
private int altitude;
private int capacity;
public Plane(string model, int cost, int altitude, int capacity)
: base(model, cost)
{
this.altitude = altitude;
this.capacity = capacity;
}
public int CompareTo(object obj)
{
string s1 = obj.GetType().Name;
string s2 = ((object)this).GetType().Name;
if (string.Compare(s1, s2) != 0)
return base.CompareTo(obj);
else
{
Plane tmp = (Plane)obj;
if (this.capacity > tmp.capacity)
return 1;
if (this.capacity < tmp.capacity)
return -1;
return 0;
}
}
public override void Passport()
{
Console.WriteLine("Модель {0}, Стоимость = {1}, Высота = {2}, Вместимость = {3}",
this.Model, this.Cost, this.altitude, this.capacity);
}
public int Altitude
{
get
{
return altitude;
}
set
{
altitude = value;
}
}
public int Capacity
{
get
{
return capacity;
}
set
{
capacity = value;
}
}
}
class Car : Vehicle, IComparable
{
private int maxspeed;
public Car(string model, int cost, int maxspeed)
: base(model, cost)
{
this.maxspeed = maxspeed;
}
public int CompareTo(object obj)
{
string s1 = obj.GetType().Name;
string s2 = ((object)this).GetType().Name;
if (string.Compare(s1, s2) != 0)
return base.CompareTo(obj);
else
{
Car tmp = (Car)obj;
if (this.maxspeed > tmp.maxspeed)
return 1;
if (this.maxspeed < tmp.maxspeed)
return -1;
return 0;
}
}
public override void Passport()
{
Console.WriteLine("Модель {0}, Стоимость = {1}, Максимальная Скорость = {2}",
this.Model, this.Cost, this.maxspeed);
}
public int Maxspeed
{
get
{
return maxspeed;
}
set
{
maxspeed = value;
}
}
}
class Ship : Vehicle, IComparable
{
private int capacity;
private string port;
public Ship(string model, int cost, string port, int capacity)
: base(model, cost)
{
this.port = port;
this.capacity = capacity;
}
public int CompareTo(object obj)
{
string s1 = obj.GetType().Name;
string s2 = ((object)this).GetType().Name;
if (string.Compare(s1, s2) != 0)
return base.CompareTo(obj);
else
{
Ship tmp = (Ship)obj;
return string.Compare(this.port, tmp.port);
}
}
public override void Passport()
{
Console.WriteLine("Модель {0}, Стоимость = {1}, Порт {2}, Вместимость = {3}",
this.Model, this.Cost, this.port, this.capacity);
}
public int Capacity
{
get
{
return capacity;
}
set
{
capacity = value;
}
}
public string Port
{
get
{
return port;
}
set
{
port = value;
}
}
}
class Program
{
public static void Main(string[] arg)
{
Console.WriteLine("Лабораторная работа №8. Выполнил студент XXXXX группы XXXXX");
Console.WriteLine("Задание:\nСоздать абстрактный класс Vehicle (транспортное средство). На его основе \nреализовать классы Plane (самолет), Car (автомобиль) и Ship (корабль). \nКлассы должны иметь возможность задавать и получать параметры средств \nпередвижения с помощью свойств. \nДля самолета должна быть определена высота, для самолета и корабля \nколичество пассажиров, для корабля — порт приписки.");
Console.WriteLine("Для хранения использовать параметризированные коллеции");
Console.WriteLine("Во всех класса реализовать интерфейс IComparable");
ArrayList lst = new ArrayList();
lst.Add(new Plane("Plane_Strela", 4000, 40000, 2));
lst.Add(new Ship("Ship_Avrora", 1000, "Marcel", 500));
lst.Add(new Car("Car_Mersedes", 300, 210));
lst.Add(new Ship("Ship_Shlupka", 10, "Ivanovo", 3));
lst.Add(new Car("Car_BMW", 300, 220));
lst.Add(new Car("Car_Jaguar", 900, 350));
lst.Add(new Plane("Plane_Boing", 3000, 30000, 500));
lst.Add(new Ship("Ship_Titanic", 900, "San-Francisco", 3000));
lst.Add(new Plane("Plane_Tu152", 3500, 35000, 350));
for (int i = 0; i < lst.Count; i++)
((Vehicle)lst[i]).Passport();
Console.WriteLine("\n\nОтсортированный массив:");
lst.Sort();
for (int i = 0; i < lst.Count; i++)
((Vehicle)lst[i]).Passport();
}
}
}
Рисунок 8.5 – Результат работы задания 1
В программе создается абстрактный класс и 3 производных от него класса. В качестве примера использования этих классов создается список, а его элементами являются объекты производных классов. Для классов определен интерфейс сравнения. В случае сравнения разных классов, используется сравнение базового класса. В результате мы видим, что в отсортированном списке подряд идут экземпляры одинаковых классов, сравниваются же они по своим индивидуальным полям(Car – максимальная скорость, Plane – вместимость, Ship – имени порта).