Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовой проект ООП(Мирошников Иван, группа И-141).docx
Скачиваний:
18
Добавлен:
15.03.2016
Размер:
622.61 Кб
Скачать

1.8. Множественное наследование. Интерфейсы

Множественное наследование - наследование от нескольких базовых классов одновременно.

Используя механизм наследования, мы можем дополнять и переопределять общий функционал базовых классах в классах-наследниках. Однако напрямую мы можем наследовать только от одного класса, в отличие, например, от языка С++, где имеется множественное наследование.

В языке C# подобную проблему позволяют решить интерфейсы. Они играют важную роль в системе ООП. Интерфейсы позволяют определить некоторый функционал, не имеющий конкретной реализации. Затем этот функционал реализуют классы, применяющие данные интерфейсы.

У интерфейса методы и свойства не имеют реализации, в этом они сближаются с абстрактными методами абстрактных классов. Сущность данного интерфейса проста: он определяет два свойства для текущей суммы денег на счете и ставки процента по вкладам и два метода для добавления денег на счет и изъятия денег.

Еще один момент в объявлении интерфейса: все его члены - методы и свойства не имеют модификаторов доступа, но фактически по умолчанию доступ public, так как цель интерфейса - определение функционала для реализации его классом. Поэтому весь функционал должен быть открыт для реализации.

2. Практическая часть

2.1. Постановка задачи

Цель работы: Разработать программу в среде C++ Builder, прорисовывающую графический объект и реализующую возможность управляемого перемещения, с использованием основных средств ООП в соответствии с заданием.

Программа должна выполнять в общем три задачи:

  1. Создание поля для игры.

  2. Расположение объектов согласно заданным координатам.

  3. Уничтожение объектов по указанным координатам.

  4. Вывод результатов игры.

Все полученные результаты отобразить на экране.

Название игры: Морской бой

Правила игра: Сначала необходимо расставить корабли. После расстановки кораблей начинается игра. Игрок поочередно с компьютером стреляют по карте. При попадании даётся ещё один выстрел. Побеждает тот кто уничтожит все корабли первым.

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");

}

}

}