Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Наследование классов и интерфейсов (http://forum.oszone.net/showthread.php?t=237990)

Tonny_Bennet 05-07-2012 18:19 1946616

Наследование классов и интерфейсов
 
Здравствуйте.

Есть некоторое устройство подключаемое по 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 1948879

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

Tonny_Bennet 09-07-2012 20:45 1948893

Beyound, спасибо что отозвались... а то подумал что вообще даже идей не будет :(

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

Beyound 10-07-2012 19:02 1949439

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

Tonny_Bennet 10-07-2012 23:14 1949638

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

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

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

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


Время: 01:43.

Время: 01:43.
© OSzone.net 2001-