Просмотр сообщений

В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.


Сообщения - Madzi

Страницы: 1 ... 4 5 [6]
76
Общий раздел / Re: [Oberon-07/11] Беззнаковое целое.
« : Декабрь 15, 2012, 02:48:23 pm »
А как же SET, или он не 32 бита ?

77
Общий раздел / Re: Интерфейсы в Оберонах
« : Апрель 17, 2012, 09:12:45 pm »
Таким образом получаем тот самый "индокод" что был поскипан :-)
Да. Но это индокод для джавы, в которой есть дженерики и правильно делать на них. Для языка, где есть только интерфейсы это не будет индокодом :)

78
Общий раздел / Re: Интерфейсы в Оберонах
« : Апрель 17, 2012, 09:05:48 pm »
Ок. Без дженериков придётся заводить ещё один интерфейс, наследующий интересующие

79
Общий раздел / Re: Интерфейсы в Оберонах
« : Апрель 17, 2012, 07:19:13 pm »

А ты допиши в свой код функцию которая хочет от аргумента что бы он умел и A и B, но при этом ничего не знает про класс CAB.

public void foo (<T implements A. B> arg) {
}

80
Общий раздел / Re: Интерфейсы в Оберонах
« : Апрель 17, 2012, 06:19:31 pm »
За счет того, что нет комбинаторного взрыва интерфейсов. Допустим у нас есть функции a, b, c. Какие-то функции хотят от типа аргумента чтобы он умел только a, а кто-то хочет только b. А кто-то и a и b одновременно. Итого получаем следующие сочетания которые могут потребоваться: a, b, c, ab, ac, bc, abc.

... индусский код скипнут...

А почему нельзя напистаь так:
public interface A {
    public void a();
}

public interface B {
    public void b();
}

public class CAB implements A, B {
}

public class CA implements A {
}

81
Хотел ответить каждому, но накопилось много ответов, так что буду отвечать всем :)

1. "Message Bus" не панацея, есть множество способов как можно не потерять производительность (например, введя поле id).
2. Интерфейсов, как правило, много не реализуют в одном объекте (мне максимум встетилось 1 раз 7 интерфейсов). Проверка 1 или 7 последовательных значений не сильно усложнит проверку типа, и не сильно её затормозит.
3. Препроцессоры в обероне смысла не имеют! Поясняю:
Одними из ключевых принципов Оберона (как концепции, а не как языка) является единство исходного кода и реализации плюс одноразовость компиляции (нет необходимости в перекомпиляции исходников при каждой сборке). Что мы получаем в случае предпроцессора: Сгенерёный символьный файл и бинарный модуль будут отличатся от исходного файла, плюс (внимание, любители ifdef) возможно получение различного бинарного кода (символьного файла) при перекомпиляции (если будут другие условия). Вирт стремился к максимальной переносимости кода между системами и максимальной единообразности кода в различных системах, а препроцессоры способствуют получению разного кода в одной и той же системе (при чуть изменившихся условиях).

Уж лучше тогда подумать, как реализовать в обероне дженерики. Если оно вообще нужно.

С интерфейсами - всё проще. Интерфейс - это контракт, такой же как и запись, только на имена процедур у конкретного объекта. т.е., что конкретный объект будет обладать данными процедурами.
Например:
    Figure* = OBJECT
        VAR
            x, y : REAL;
            color : LONGINT;

        PROCEDURE &New*(x, y : REAL; color : LONGINT);
        BEGIN
            SELF.x := x;
            SELF.y := y;
            SELF.color := color;
        END New;
    END Figure;

    Drawable* = INTERFACE
        PROCEDURE Draw*(canvas : Raster.Raster);
    END Drawable;

    Point* = OBJECT(Figure, Drawable)
        PROCEDURE Draw*(canvas : Raster.Raster);
        BEGIN
            canvas.PutPixel(x, y, color);
        END Draw;
    END Point;

    GeomList* = ARRAY OF Drawable;

Т.е. принципиально, всегда в любой системе, у модуля будет один и тот же код, только реализуемая логика может получится значительно проще, чем без интерфейсов. Для интерфейсных методов, можно предусмотреть реакции по умолчанию. Т.е. если процедура не реализована в объекте, то она либо ничего не возвращает (пустая процедура), либо возвращает 0/0.0/NIL.

82
И какой вывод?

Как вы считаете, стоит ли дополнить Оберон (не важно какой), интерфейсами с множественным наследованием интерфейсов? Я думаю что это сделать не сильно сложно и особо оберону это не повредит, так как не противоречит его идеологии.

83
Использование контейнера обёртки, и есть эмуляция множественного наследования.
Допустим, что у нас есть объекты
TYPE
    Sortable = OBJECT ... END Sortable;
    Serialable = OBJECT ... END Serialable;
    Listenable = OBJECT ... END Listenable;
и есть базовый объект (MyObject), который хотелось бы унаследовать от данных. Прямого множественного  наследования  в оберонах нет, поэтому нужно эмулировать:
TYPE
    ProxySortable = OBJECT(Sortable)
        VAR
            myObject : MyObject;
        PROCEDURE AsMyObject() : MyObject;
        ...
    END ProxySortable;

    ProxySerializable = OBJECT(Serializable)
        VAR
            myObject : MyObject;
        PROCEDURE AsMyObject() : MyObject;
        ...
    END ProxySerializable;

    ProxyListenable = OBJECT(Listenable)
        VAR
            myObject : MyObject;
        PROCEDURE AsMyObject() : MyObject;
        ...
    END ProxyListenable

    MyComplexObject = OBJECT(MyObject)
        VAR
           sortable : ProxySortable;
           serializable : ProxySerialiable;
           listenable : ProxyListenable;
           ...
        PROCEDURE AsSortable() : ProxySortable;
        ...
        PROCEDURE AsSerializable() : ProxySerializable;
        ...
        PROCEDURE AsListenable() : ProxyListanable;
        ....
    END MyComplexObject;
Таким образом всё во всё преобразуется (наследуется), в прокси классах реализуется требуемое поведение.
Ну и главное потом не забыть разрушить циклические ссылки, для чего можно написать деструктор
PROCEDURE Done*();
BEGIN
    proxySortable^.myObject := NIL;
    proxySortable := NIL;
    proxySerializable^.myObject := NIL;
    proxySerializable := NIL;
    proxyListenable^.myObject := NIL;
    proxyListenable := NIL
END Done;

84
Максимум, что можно сделать, это через метаинформацию типа выудить тип первого добавленного элемента и требовать ассертом, чтобы все остальные элементы ему соответствовали. Так как Вирт не дал нам дженериков :)

85
Не было там никакого ужаса. Там был кастиг типов, и чтобы от него избавится я предложил свой вариант. В котором уже совсем нет приведения типов.

86
Ярослав Романченко, некоторое время назад, выкладывал пример с контейнерами в А2 (обероны) на oberonCore. А я его немного развил

Страницы: 1 ... 4 5 [6]