Войти в систему

Home
    - Создать дневник
    - Написать в дневник
       - Подробный режим

LJ.Rossia.org
    - Новости сайта
    - Общие настройки
    - Sitemap
    - Оплата
    - ljr-fif

Редактировать...
    - Настройки
    - Список друзей
    - Дневник
    - Картинки
    - Пароль
    - Вид дневника

Сообщества

Настроить S2

Помощь
    - Забыли пароль?
    - FAQ
    - Тех. поддержка



Пишет kouzdra ([info]kouzdra) в [info]programming
@ 2005-11-07 22:59:00


Previous Entry  Add to memories!  Tell a Friend!  Next Entry
Про объекты в O'Caml:
Объектность там забавная и в каком-то смысле очень оригинальная

Во-первых - типизация там, как и везде статическая.
Во-вторых - при этом там не наследования в обычном смысле
этого слова.

То есть: "объектный тип" (АКА class type - типы, которые приписываются
значениям объектам) - это сигнатура. То есть - список методов,
которые должны быть у объекта + их типы. Ну например -

type p2d = < x : int; y : int > 


тип, которому соотвествует любой объект, у которого есть методы x и y,
возвращающие int. Соотвественно - естественным путем возникает
отношение тип-подтип между объектными типами. Оно и заменяет наследование.
Важно не то, как объекты образоывывались, а что они умеют.


Более интересный пример (кажется не выразимый ни в одном из статически
типизированных языкоа):

type eq = < eq : 'a -> bool > as 'a


Тут это тип объекта, у которого есть метод eq, ожидающий получить параметром
объект в точности того же самого типа. Понятно, что трехмерная точка
будет одноврменно и двумерной, но сравнение на = разнородных точек вряд ли уместно.

Наследование, конечно, есть, но это конструкция скорее синтаксическая -
вместо использования inherit, можно просто повторить все тоже самое
руками. Результат, за исключением тонких нюансов, отличаться не будет:
class p2d (x:int) (y:int) = object (self:'self)
    method x = x
    method y = y
    method eq (a: 'self) = self#x = a#x && self#y = a#y
end
                                                                                                
class p3d (x:int) (y:int) (z:int) = object (self:'self)
    inherit p2d x y as super
    method z = z
    method eq (a: 'self) = super#eq (a :> 'self) && self#z = a#z
end
                                                                                                
class p3d' (x:int) (y:int) (z:int) = object (self:'self)
    method x = x
    method y = y
    method z = z
    method eq (a: 'self) = self#x = a#x && self#y = a#y && self#z = a#z
end
                    
let p2 = new p2d 1 2                                                                             
let p3_1 = new p3d 1 2 3
let p3_2 = new p3d 1 2 3
let _ = Printf.printf "%b\n" (p3_1#eq p3_2)


Разницы между p3d и p3d' с точки зрения типов нет никакой. Типы
у них идентичны.

Обращу внимание,что
p2#eq p3_1
написать нельзя. Будет
ошибка типизации.

Вот вкратце все.

Как это реализуется (а вызов метода делается за константное время),
будет в следующем номере.


(Читать комментарии) - (Добавить комментарий)

Re: offtop
[info]polytheme
2005-11-14 22:57 (ссылка)
ещё хотел спросить - не сталкивались ли с проблемой нативной компиляции - линкер под windows насыпает кучу сообщений
/cygdrive/c/Program Files/Objective Caml/lib/libasmrun.a(win32.o)(.text+0x94d):win32.c: undefined reference to `__errno'
уже при компиляции файла с одной строчкой "let x=1;;"

(Ответить) (Уровень выше)


(Читать комментарии) -