Связи между классами. Объектно-ориентированное программирование. (Лекция 3)

Содержание

Слайд 2

Отношения между классами Емельянов В.А.: Объектно-ориентированное программирование Особенности классов и объектов

Отношения между классами

Емельянов В.А.: Объектно-ориентированное программирование

Особенности классов и объектов в ООП:
Классы

редко бывают изолированными друг от друга
Классы связаны друг с другом разными видами отношений, которые характеризуют разные виды взаимодействия
Основными типами связей между классами являются:
отношение наследования
отношение реализации
отношение ассоциации
отношения композиции и агрегации
Слайд 3

Отношения между классами: Наследование Емельянов В.А.: Объектно-ориентированное программирование Наследование позволяет одному

Отношения между классами: Наследование

Емельянов В.А.: Объектно-ориентированное программирование

Наследование позволяет одному классу (наследнику) унаследовать

функционал другого класса (родительского).
Отношения наследования еще называют генерализацией или обобщением.
Наследование определяет отношение  IS A, то есть "является"

UML

C#

class User
{
public int Id { get; set; }
public string Name { get; set; }
}
class Manager : User
{
public string Company { get; set; }
}

1
2
3
4
5
6
7
8
9
10
11
12

Слайд 4

Отношения между классами: Реализация Емельянов В.А.: Объектно-ориентированное программирование Реализация предполагает определение

Отношения между классами: Реализация

Емельянов В.А.: Объектно-ориентированное программирование

Реализация предполагает определение интерфейса и его

реализация в классах.
Например, имеется интерфейс IMovable с методом Move(), который реализуется в классе Car:

UML

C#

public interface IMovable
{
void Move();
}
public class Car : IMovable
{
public void Move()
{
Console.WriteLine("Машина едет");
}
}

1
2
3
4
5
6
7
8
9
10
11
12

Слайд 5

Отношения между классами: Ассоциация Емельянов В.А.: Объектно-ориентированное программирование Ассоциация - это

Отношения между классами: Ассоциация

Емельянов В.А.: Объектно-ориентированное программирование

Ассоциация - это отношение, при котором

объекты одного типа неким образом связаны или используют объекты другого типа.
Например, игрок играет в определенной команде (класс Player связан отношением ассоциации с классом Team):

UML

C#

1
2
3
4
5
6
7
8
9
10
11
12

class Team
{
}
class Player
{
public Team Team
{ get; set; }
}

Слайд 6

Отношения между классами: Композиция Емельянов В.А.: Объектно-ориентированное программирование Композиция определяет отношение

Отношения между классами: Композиция

Емельянов В.А.: Объектно-ориентированное программирование

Композиция определяет отношение HAS A, то есть

отношение "имеет".
Например, в класс автомобиля содержит (HAS A) объект класса электрического двигателя:

UML

C#

public class ElectricEngine
{ }
public class Car
{
ElectricEngine engine;
public Car()
{
engine = new ElectricEngine();
}
}

1
2
3
4
5
6
7
8
9
10
11
12

Слайд 7

Отношения между классами: Композиция Емельянов В.А.: Объектно-ориентированное программирование Класс автомобиля полностью

Отношения между классами: Композиция

Емельянов В.А.: Объектно-ориентированное программирование

Класс автомобиля полностью управляет жизненным циклом

объекта двигателя.
При уничтожении объекта автомобиля в области памяти вместе с ним будет уничтожен и объект двигателя. И в этом плане объект автомобиля является главным, а объект двигателя - зависимым.

UML

C#

public class ElectricEngine
{ }
public class Car
{
ElectricEngine engine;
public Car()
{
engine = new ElectricEngine();
}
}

1
2
3
4
5
6
7
8
9
10
11
12

Слайд 8

Отношения между классами: Агрегация Емельянов В.А.: Объектно-ориентированное программирование Агрегация также предполагает

Отношения между классами: Агрегация

Емельянов В.А.: Объектно-ориентированное программирование

Агрегация также предполагает отношение HAS A, но

реализуется она иначе:

UML

public abstract class Engine
{ }
public class Car
{
Engine autoEngine;
public Car(Engine engine1)
{
autoEngine = engine1;
}
}

1
2
3
4
5
6
7
8
9
10
11
12

C#

При агрегации реализуется слабая связь, то есть в данном случае объекты Car и Engine будут равноправны. В конструктор Car() передается ссылка на уже имеющийся объект Engine. И, как правило, определяется ссылка не на конкретный класс, а на абстрактный класс или интерфейс, что увеличивает гибкость программы.