Как нормально пробросить данные в дочерние классы, используя ООП? Доброе время суток! Пытаюсь сделать ИИ по совести, чтобы и ООП был, и универсальный, но не получается. Тупо C# не позволяет мне сделать это даже с генериками. Цель - пробросить в реализацию интерфейса IBotBehaviour кастомную информацию, нужную лишь для данного поведения. Хотелось бы пробросить ее через конструктор или метод. Но так, чтобы ее было обязательно пробрасывать.
Вот пример интерфейсов и реализаций:
IBotBehaviour - интерфейс поведения, который должен обязывать передавать ему информацию.
IBot - использует IBotBehaviour.
IdleBehaviour - ничего не делает, следовательно инфа ему никакая не нужна.
FollowBehaviour - требует 2 аргумента типа Positionу
BotTest - использует попеременно разные поведения и пробрасывает в них совершенно разные параметры.Пример кодаpublic interface IBotBehaviour
{
void Process();
void Setup(); // ?
}
public interface IBot
{
void SetBehaviour(IBotBehaviour behaviour);
}
public class IdleBehaviour : IBotBehaviour
{
public void Process()
{
// wait 1s
}
public void Setup()
{
}
}
public class FollowBehaviour : IBotBehaviour
{
Position myPosition;
Position targetPosition;
public void Process()
{
// move my pos to target pos
}
public void Setup(Position myPosition, Position targetPosition)
{
this.myPosition = myPosition;
this.targetPosition = targetPosition;
}
}
public class BotTest : IBot
{
protected IBotBehaviour currentBehaviour;
public void SetBehaviour(IBotBehaviour behaviour)
{
currentBehaviour = behaviour;
}
// call currentBehaviour.Process() in game cycle
}

21 Авг 2019 в 06:59
197 +1
0
Ответы
1

Для того чтобы передавать различные параметры в разные реализации интерфейса IBotBehaviour, вы можете воспользоваться обобщенным интерфейсом. Например, добавив обобщенный тип T к интерфейсу IBotBehaviour, вы сможете передавать различные типы данных в методы этого интерфейса в зависимости от реализации.

Пример измененного кода:

public interface IBotBehaviour<T>
{
void Process();
void Setup(T data);
}
public interface IBot
{
void SetBehaviour<T>(IBotBehaviour<T> behaviour);
}
public class IdleBehaviour : IBotBehaviour<object>
{
public void Process()
{
// wait 1s
}
public void Setup(object data)
{
// setup
}
}
public class FollowBehaviour : IBotBehaviour<Position>
{
Position myPosition;
Position targetPosition;
public void Process()
{
// move my pos to target pos
}
public void Setup(Position data)
{
myPosition = data;
}
}
public class BotTest : IBot
{
protected IBotBehaviour<object> currentBehaviour;
public void SetBehaviour<T>(IBotBehaviour<T> behaviour)
{
currentBehaviour = (IBotBehaviour<object>)behaviour;
}
// call currentBehaviour.Process() in game cycle
}

Теперь у вас есть возможность передавать параметры нужного типа в каждую реализацию IBotBehaviour через метод Setup.

20 Апр в 13:10
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 588 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир