Как нормально пробросить данные в дочерние классы, используя ООП? Доброе время суток! Пытаюсь сделать ИИ по совести, чтобы и ООП был, и универсальный, но не получается. Тупо 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 }
Для того чтобы передавать различные параметры в разные реализации интерфейса 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.
Для того чтобы передавать различные параметры в разные реализации интерфейса 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.