- •Оглавление
- •Введение
- •1.Теоретическая часть
- •1.1.Объектно-ориентированное программирование
- •1.2. Инкапсуляция
- •1.3. Полиморфизм
- •1.4.Наследование
- •1.5. Абстрагирование
- •1.6.Статические классы и методы
- •1.7.Виртуальные функции и чистые виртуальные функции
- •1.8. Множественное наследование. Интерфейсы
- •2. Практическая часть
- •2.1. Постановка задачи
- •2.2.Программирование задачи
- •2.3. Результаты работы
- •3.Заключение
- •Листинг программы Файл Form1.Cs
- •Файл Ships.Cs
- •Файл Places.Cs
- •Файл ShipAi.Cs
- •Список литературы
1.8. Множественное наследование. Интерфейсы
Множественное наследование - наследование от нескольких базовых классов одновременно.
Используя механизм наследования, мы можем дополнять и переопределять общий функционал базовых классах в классах-наследниках. Однако напрямую мы можем наследовать только от одного класса, в отличие, например, от языка С++, где имеется множественное наследование.
В языке C# подобную проблему позволяют решить интерфейсы. Они играют важную роль в системе ООП. Интерфейсы позволяют определить некоторый функционал, не имеющий конкретной реализации. Затем этот функционал реализуют классы, применяющие данные интерфейсы.
У интерфейса методы и свойства не имеют реализации, в этом они сближаются с абстрактными методами абстрактных классов. Сущность данного интерфейса проста: он определяет два свойства для текущей суммы денег на счете и ставки процента по вкладам и два метода для добавления денег на счет и изъятия денег.
Еще один момент в объявлении интерфейса: все его члены - методы и свойства не имеют модификаторов доступа, но фактически по умолчанию доступ public, так как цель интерфейса - определение функционала для реализации его классом. Поэтому весь функционал должен быть открыт для реализации.
2. Практическая часть
2.1. Постановка задачи
Цель работы: Разработать программу в среде C++ Builder, прорисовывающую графический объект и реализующую возможность управляемого перемещения, с использованием основных средств ООП в соответствии с заданием.
Программа должна выполнять в общем три задачи:
Создание поля для игры.
Расположение объектов согласно заданным координатам.
Уничтожение объектов по указанным координатам.
Вывод результатов игры.
Все полученные результаты отобразить на экране.
Название игры: Морской бой
Правила игра: Сначала необходимо расставить корабли. После расстановки кораблей начинается игра. Игрок поочередно с компьютером стреляют по карте. При попадании даётся ещё один выстрел. Побеждает тот кто уничтожит все корабли первым.
2.2.Программирование задачи
Объявление классов в C#.
Класс Places
Это класс карты игры.
public class Places
{
public static int weight, height; // длина и ширина поля
static Places() // статический конструктор класса Places
{
weight = 11;
height = 11;
}
public char[,] map = new char[weight, height]; // поле для игры
public void create() // метод создания поля игры
{
for (int i = 1; i < weight; i++)
{
for (int j = 1; j < height; j++)
{
this.map[i, j] = Convert.ToChar("+");
}
}
}
}
Класс Ships
public class Ships
{
Form1 form;
public int ships_leght;
public int coordX, coordY;
public Ships()
{
coordX = 0;
coordY = 0;
}
public Ships(int k)
{
ships_leght = k;
}
public virtual void fight_places(Places p)
{
int a = coordX;
int b = coordY;
for (int i = a; i < (a + 1); i++)
{
for (int j = b; j < b + ships_leght; j++)
{
p.map[i, j] = Convert.ToChar("X");
}
}
}
public virtual void vert(Places p)
{
int a = coordX;
int b = coordY;
for (int i = a; i < (a + 1); i++)
{
for (int j = b; j < b + ships_leght; j++)
{
p.map[j, i] = Convert.ToChar("X");
}
//else
//{
// MessageBox.Show("Нельзя так близко ставить корабли", "Близко!", MessageBoxButtons.OK, MessageBoxIcon.Error);
// //form.enter_coordinates(this);
//}
}
}}
В этом классе присутствуют виртуальные методы, которые переопределяются в классе-наследнике.
Класс ShipAI
Это класс-наследник от производного класса Ship.
class ShipAI : Ships
{
Random rand = new Random();
public void enter()
{
coordX = rand.Next(1, 9);
coordY = rand.Next(1, 9);
}
public ShipAI(int k) : base(k)
{
}
public void placement()
{
int a = rand.Next(1, 2);
switch(a)
{
case 1: break;
case 2: break;
}
}
public override void fight_places(Places p)
{
enter();
int a = coordX;
int b = coordY;
for (int i = a; i < (a + 1); i++)
{
for (int j = b; j < b + ships_leght; j++)
{
//if ((p.map[i, j] != Convert.ToChar("X")) && (p.map[i, j + ships_leght] != Convert.ToChar("X")) && (p.map[i + 1, j] != Convert.ToChar("X")) && (p.map[i - 1, j] != Convert.ToChar("X")))
p.map[i, j] = Convert.ToChar("X");
}
}
}
public override void vert(Places p)
{
int a = coordY;
int b = coordX;
for (int i = a; i < (a + 1); i++)
{
for (int j = b; j < b + ships_leght; j++)
{
if ((p.map[i, j] != Convert.ToChar("X")) && (p.map[i + ships_leght, j] != Convert.ToChar("X")) && (p.map[i, j + 1] != Convert.ToChar("X")) && (p.map[i, j - 1] != Convert.ToChar("X")))
{ p.map[j, i] = Convert.ToChar("X"); }
}
}
}
}
В этом классе переопределяются методы производного класса. Например такой метод как fight_places(Places p) в классе Shipреализутеся так:
public virtual void fight_places(Places p)
{
int a = coordX;
int b = coordY;
for (int i = a; i < (a + 1); i++)
{
for (int j = b; j < b + ships_leght; j++)
{
p.map[i, j] = Convert.ToChar("X");
}
}
}
А в классе ShipAIтак:
public override void fight_places(Places p)
{
enter();
int a = coordX;
int b = coordY;
for (int i = a; i < (a + 1); i++)
{
for (int j = b; j < b + ships_leght; j++)
{
if ((p.map[i, j] != Convert.ToChar("X")) && (p.map[i, j + ships_leght] != Convert.ToChar("X")) && (p.map[i + 1, j] != Convert.ToChar("X")) && (p.map[i - 1, j] != Convert.ToChar("X")))
p.map[i, j] = Convert.ToChar("X");
}
}
}