76
Общий раздел / Re: [Oberon-07/11] Беззнаковое целое.
« : Декабрь 15, 2012, 02:48:23 pm »
А как же SET, или он не 32 бита ?
Онлайн компилятор Oberon-07/11
Путеводитель по Оберон-проектам.
Логи jabber-конференции.
Онлайн исходники BlackBox: тут:WeBB и на github
Исходники Project Oberon V4 на github.
Сборник решений задач книги "Современное программирование с нуля!" тут. А обсуждение здесь.
В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.
Таким образом получаем тот самый "индокод" что был поскипан :-)Да. Но это индокод для джавы, в которой есть дженерики и правильно делать на них. Для языка, где есть только интерфейсы это не будет индокодом
А ты допиши в свой код функцию которая хочет от аргумента что бы он умел и A и B, но при этом ничего не знает про класс CAB.
public void foo (<T implements A. B> arg) {
}
За счет того, что нет комбинаторного взрыва интерфейсов. Допустим у нас есть функции 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 {
}
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;
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;