Как нормально пробросить данные в дочерние классы, используя ООП? Доброе время суток! Пытаюсь сделать ИИ по совести, чтобы и ООП был, и универсальный, но не получается. Тупо 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
225 +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 Апр 2024 в 13:10
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир