Войти

Показать полную графическую версию : Наследование классов и интерфейсов


Tonny_Bennet
05-07-2012, 18:19
Здравствуйте.

Есть некоторое устройство подключаемое по COM-порту к компьютеру. Я написал класс Module который описывает внутреннюю структуру этого устройства (линии ввода-вывода, реле, линии входа АЦП). Этот модуль физически управляет движением автомобиля, к примеру. И вот для того, что бы автомобиль поехал вперёд нужно на трёх определённых линиях модуля установить заданные значения, что бы поехал влево нужно установить другие значения и т.д.

Мне хочется сделать некоторый класс (или что-то ещё), который будет служить некоторой прослойкой.

Я создал интерфейс и класс-наследник.



public interface IState
{
void Stop();
void Forward();
void Back();
void Left();
void Right();
}

public class Bot : Module, IState
{

public void Stop()
{
this.lineIO[0].Off();
this.lineIO[1].Off();
}

public void Forward()
{
this.lineIO[0].On();
this.lineIO[1].On();
}

public void Back(){ }

public void Left() { }

public void Right() { }
}



В принципе работает, но вот есть один минус: сопоставление Forward -> lineIO[0].On() lineIO[1].On() делается в самом классе, и в ходе работы программы изменить не получится.

Что нужно сделать, что бы можно было делать это сопоставление на уровне конструктора объекта класса Bot?

Beyound
09-07-2012, 20:25
тут стоит смериться - код уменьшить не получится и либо в forward указывать все возможные варианты с выбором на основе некой приватной(публичной или защищенной) переменной внутри класса Bot, которая выставляется по входному параметру конструктора (или еще как), либо в самом классе bot предусмотреть некие приватные подфункции, множество которых способно описать все разнообразие возможных действий в forward и ему подобных, а в самом forward только описать условия по той же приватной(публичной или защищенной) переменной.
а... есть еще вариант- так называемые директивы препроцессора. но тут конкретный способ будет определен при компиляции программы, а не в ходе ее исполнения.

Tonny_Bennet
09-07-2012, 20:45
Beyound, спасибо что отозвались... а то подумал что вообще даже идей не будет :(

В принципе я могу смириться с тем, что код станет неуменьшаемым, но как обходятся с этим конструкторы игоромобилей или программисты игр. Есть интерфейс пользователя, клавиши нажимает - мышкой двигает. Создаются события. И мне сильно кажется, что исходя из этих событий не пишутся команды в контролеры, а создаются другие события или есть некоторый класс, который связывает эти вещи (в моём случае это Bot).

Beyound
10-07-2012, 19:02
ну незнаю кто как делает, но вообще игры пишутся так - есть некоторый цикл глобальной прорисовки, работающий ну грубо говоря циклично, как закончился начинается с начала. этот цикл сам вызывает в классах (деревьях, машинках и т.п.) функции прорисовки, которые по состоянию этого класса и поступающих внешних прерываний определяют как изменяется этот объект во времени. ясное дело что скажем машинка как класс может состоять из класса колесо, кабина и т.д. и тогда функция прорисовки машинки не что иное как вызов в подклассах функций прорисоки их. в итоге все сводится к тому что в самом глубоко классе написато что (грубо) исходя из "обстаноки" такая то фигурка с такими то текстурами имеет такие то координаты.
как же на все это влияет нажатие кнопок мышки или клавы - а легко - эти события чаще всего фиксируются по факту, а вот в функциях прорисовки описывается, что делать при обнаружении прерывания с клавы и т.п. оно наглядно видно - когда игра очень грузит комп то следующий кадр - это суммарно все то, что нажал игрок между предыдущим кадром и расчетом следующего.

Tonny_Bennet
10-07-2012, 23:14
Beyound, фактически сейчас у меня похожая реализация работы. По таймеру в контролеер пишутся значения некоторых переменных. События, нажатия клавиатуры - меняют эти значения, и соответственно они попадают в контроллер.

Я хотел некоторым образом съэкономить на трафике между компьютером и контроллером.

В начальный момент времени в контролер попадают значения по-умолчанию.

При нажатии на кнопку "Up", к примеру, происходит изменение переменной, генерируется событие изменения, обработчик события записывает текущее состояние переменных в контроллер. И пока я не отпустил кнопку "Up" другое событие не будет генерироваться и данные не будут писаться в контроллер.




© OSzone.net 2001-2012