Всем добра и позитива. Вопрос больше по архитектуре кода в

нашем любимом Юнити. Предположим, есть фигуры, которые реализуют интерфейс IMovable, в котором сопрограмма MovingTo(Vector2 point). Так вот, реализуя этот метод, не ломается ли принцип ООП - инкапсуляция из-за публичности сопрограммы?

20 ответов

28 просмотров

1) это не сопрограмма, а метод 2) таким образом реализуется абстрагирование, инкапсуляция здесь не у дел

Интерфайс тебе гарантирует наличие метода, а реализация будет инкапсулирована внутри классов, реализующих интерфейс. В этом и заключается инкапсуляция, иначе у тебя вместо myObject.MoveTo() было бы что-то вроде if (myObject is Type1) { /// двигаем объект типа Type1 } else if (myObject is Type2) { // двигает по-другому } ...

Rusya- Автор вопроса
Константин ARORA
Интерфайс тебе гарантирует наличие метода, а реали...

Разве любой другой желающий класс, имеющий доступ к экземпляру с интерфейсом, не может сказать, чтобы он начал движение к определенной точке?

Rusya- Автор вопроса
Alexander Pluzhnikov
1) это не сопрограмма, а метод 2) таким образом ре...

1) В первом случае я реализую IEnumerator. public interface IMovable { IEnumerator MoveToPoint(Vector2 point); }

Rusya- Автор вопроса
Alexander Pluzhnikov
1) это не сопрограмма, а метод 2) таким образом ре...

А второй случай я уже написал Константину

Могут, интерфейс для этого и нужен чтобы любой внешний класс мог вызвать метод. Если ты хочешь сделать его скрытым от внешних классов, тогда сделай например базовый класс с реализацией метода и пометь protected, если нужно переопределять в наследниках - protected virtual

Rusya- Автор вопроса
Константин ARORA
Могут, интерфейс для этого и нужен чтобы любой вне...

Лучше тогда рассказать о полной картине: абстрактный класс Figure, у него есть 3 дочки, а именно Drag, Drop, Reducing. Только первый и третий могут передвигаться. Так как уже реализовано наследование от Figure, то остаётся вариант использования интерфейсов. Поэтому логично, что реализуя в них IMovable, метод передвижения будет открытым для других классов с экземпляром фигуры. Но мне нужно, чтобы при срабатывании ивента в фигуре происходило движение. То есть только сама фигура может вызывать данный метод и никто иначе

Rusya
Лучше тогда рассказать о полной картине: абстрактн...

Делаешь в Fugure protected virtual MoveTo() { // тут реализация } а в наследнике который не должен двигаться делаешь protected override MoveTo() { // тут ничего не происходит } тогда реализация метода MoveTo будет вызвана в соответстии с фактическим типом обекта. Интерфейс тут тебе не нужен т.к. набор методов базового класса это уже фактически "интерфейс" для наследников - им все эти методы будут видны (только если они не private)

Rusya- Автор вопроса
Константин ARORA
Делаешь в Fugure protected virtual MoveTo() { // ...

Вот как раз тут и выходит сама архитектура кода, которая при увеличении будет некорректна и просто неправильная. Добавлю ещё 10 классов, и 5 из них не будут передвигаться. Значит для каждого отдельно обнулять метод передвижения? Как только что сказал Phantom, это разрешение SOLID

Rusya
Вот как раз тут и выходит сама архитектура кода, к...

Если есть такие глобальные подмножества наследников, можно сделать FigureMovable : Figure { protected override MoveTo() { // двигаем } и FigureNotMovable : Figure { protected override MoveTo() { // не двигаем } а от них уже все остальные наследуются

Alexander Pluzhnikov
Зачем FigureNotMovable с пустым методом?

Затем что в Figure должен существовать MoveTo с который будет какой-то код в базовом классе работать

Константин ARORA
Затем что в Figure должен существовать MoveTo с ко...

Не должен. Выше было более подробное описание задачи.

Alexander Pluzhnikov
Не должен. Выше было более подробное описание зада...

> Но мне нужно, чтобы при срабатывании ивента в фигуре происходило движение. То есть только сама фигура может вызывать данный метод и никто иначе вот это можно трактовать: - либо как "каждый класс сам подписывается на событие и реализует движение" - тут подойдёт private у каждого класса с индивидуальным алгоритмом движения, - либо как "базовый класс Figure должен подписаться на событие и вызывать MoveTo" - тут не обойтись без наличия MoveTo в базовом классе Figure, а значит придёся его переопределить пустым методом

Rusya- Автор вопроса
Константин ARORA
Если есть такие глобальные подмножества наследнико...

Все верно, но есть ещё одна проблема в abstract Figure имеетсч метод abstract OnPointerDown от интерфейса IPointerDownHandler. Если подбронее, основная задача Figure - быть выбранным для дальнейших действий. При добавлении MovingFigure придется реализовать OnPointerDown, но по-хорошему нужно чтобы каждая конкретная дочка реализовывала метод OnPointerDown по-своему

Rusya
Все верно, но есть ещё одна проблема в abstract Fi...

Не придется. MovingFigure тоже может быть абстрактным.

Rusya- Автор вопроса
Alexander Pluzhnikov
Не придется. MovingFigure тоже может быть абстракт...

Да, все теперь отлично. Спасибо за советы

Похожие вопросы

Обсуждают сегодня

Добрый вечер, Пока не совсем понимаю как наладить общение между телеграм ботом и ПО для работы с сим боксом. По самому боту так понял: - Нужен некий баланс, который можно поп...
Magic
6
сделал сайт, прикрутил в боте сайт, и виджет логина. как автоматически логинить пользователя в аккаунт(телеграм), при входе с бота?
Александра Чернивецкая
5
Объясните, пожалуйста, почему компилятор ругается на использование в условии неинициализированной переменной: int x; Task.Run(async () => { x = await somefunc(); }).Wait...
Александр
5
Ребят, подскажите, пожалуйста, почему в префиксе к ассетам, которые генерируются через фильтр | theme в шаблоне, стал вдруг появляться index.php? Вот так выглядит ссылка на а...
Виталий
1
Всем привет. Ребята, подскажите, пожалуйста. у ботов есть ограничение на отправку сообщений - 30 сообщений в секунду, эти ограничения накладываются на все сообщения? или на со...
Artem Stormageddon
4
Блин, ребята, сори за тупые вопросы. А можно ли как-то открыть вебапку по нажатию на кнопку в меню(которое появляется слева, команды)?
Artem Stormageddon
3
а плаксы из-под питона умеют только в комфортных условиях что-то выдавить из себя?)
Lencore
9
Но, может, есть уже проверенная? Наши требования такие: 1. Сообщения должны приходить из Инста в CRM оду 2. Должна быть возможность подключить несколько экаунтов Инстаграм. Р...
Alexander Sharoiko MSE / Александр Шаройко
13
Это может быть все-таки не флудвейт? у меня ботфазер принимает изменения и отображает даже что они изменились, на видео видно что он прислал якобы уже измененное описание, н...
OVERLINK
13
Коллеги, может знает кто, можно ли цвет бейджа счётчика в BackendMenu менять без бубнов?
Alex Blaze
3
Карта сайта