Типы <b : bool; .. >
и <c : int; ..>
несовместимы так же, как несовместимы int
и bool
. Другими словами, если мы поместим полиморфизм строк в сторону и сосредоточьтесь на конструкторах простых типов, тогда вы пытаетесь определить интерфейс, который соответствует типам int
и bool
и ничему другому, он же ограниченный полиморфизм.
Также важно понимать, что подтипирование не является наследование. В вашем случае у вас есть два класса объектов, объекты класса b
, которые имеют метод b
class virtual b = object
method virtual b : bool
end
и c
- класс объектов, у которых есть метод c
,
class virtual c = object
method virtual c : int
end
и мы можем определить класс объектов bc
, которые имеют оба метода, естественно через наследование,
class virtual bc = object
inherit b
inherit c
end
Теперь давайте приготовим несколько предметов для игры,
let b : b = object method b = true end
let c : c = object method c = 42 end
let bc : bc = object
method b = false
method c = 56
end
Мы видим, что, несмотря на то, что тип класса bc
определен как унаследованный от b и c, мы не можем привести b
к c
,
# (b : b :> bc);;
Line 1, characters 0-13:
1 | (b : b :> bc);;
^^^^^^^^^^^^^
Error: Type b = < b : bool > is not a subtype of bc = < b : bool; c : int >
The first object type has no method c
и это имеет смысл, поскольку мы пытаемся преобразовать объект базового класса в объект производного класса, что является недопустимой операцией. Поэтому при наличии иерархии типов классов, упорядоченных по наследству, базовые классы являются супертипами, а производные классы — подтипами. Например, если v
наследуется от u
, то v
является подтипом u
,
v inherits-from u
-----------------
u :> v
Как только вы получите четкое представление об этом, вы сможете разработать правильный интерфейс.
person
ivg
schedule
24.05.2021