Сообщение Re[9]: Недоучки по настоящему ООП не освоили (из-за Basic и от 02.09.2025 14:28
Изменено 02.09.2025 14:32 korvin_
Re[9]: Недоучки по настоящему ООП не освоили (из-за Basic и
Здравствуйте, so5team, Вы писали:
S>Конкретно этот фрагмент -- это ни разу не хотелка, а обязательное требование к нормальному статически-типизированному языку: если у нас есть независимые интерфейсы A и B, то в consume_A нельзя передать ссылку на реализацию интерфейса B, а в consume_B -- нельзя передать ссылку на реализацию интерфейса A.
Эта хотелка вытекает из row polymorphism.
Реализовано для объектных типов в Ocaml, например
Примерно схожим образом работает утиная типизация интерфейсов в Go и протоколы/категории в Objective-C (вроде бы и в Swift тоже).
S>Конкретно этот фрагмент -- это ни разу не хотелка, а обязательное требование к нормальному статически-типизированному языку: если у нас есть независимые интерфейсы A и B, то в consume_A нельзя передать ссылку на реализацию интерфейса B, а в consume_B -- нельзя передать ссылку на реализацию интерфейса A.
Эта хотелка вытекает из row polymorphism.
Реализовано для объектных типов в Ocaml, например
let printf = Printf.printf
class virtual a =
object
method virtual f : unit
end
type b =
<
f : unit
>
let consume_a (x : a) =
printf "consume_A: " ;
x #f ;
print_newline ()
let consume_b (x : b) =
printf "consume_B: " ;
x #f ;
print_newline ()
let consume_c (x : < f : unit ; .. >) =
printf "consume_C: " ;
x #f ;
print_newline ()
class some_a =
object
method f =
printf "some A object"
end
let b =
object
method f =
printf "object B"
end
let main () =
let a = new some_a in
consume_a a ;
consume_a b ;
consume_b a ;
consume_b b ;
consume_c a ;
consume_c b
let () = main ()Примерно схожим образом работает утиная типизация интерфейсов в Go и протоколы/категории в Objective-C (вроде бы и в Swift тоже).
Re[9]: Недоучки по настоящему ООП не освоили (из-за Basic и
Здравствуйте, so5team, Вы писали:
S>Конкретно этот фрагмент -- это ни разу не хотелка, а обязательное требование к нормальному статически-типизированному языку: если у нас есть независимые интерфейсы A и B, то в consume_A нельзя передать ссылку на реализацию интерфейса B, а в consume_B -- нельзя передать ссылку на реализацию интерфейса A.
Нет такого требования.
В некоторых языках реализован row polymorphism.
Реализовано для объектных типов в Ocaml, например
Примерно схожим образом работает утиная типизация интерфейсов в Go и протоколы/категории в Objective-C (вроде бы и в Swift тоже).
S>Конкретно этот фрагмент -- это ни разу не хотелка, а обязательное требование к нормальному статически-типизированному языку: если у нас есть независимые интерфейсы A и B, то в consume_A нельзя передать ссылку на реализацию интерфейса B, а в consume_B -- нельзя передать ссылку на реализацию интерфейса A.
Нет такого требования.
В некоторых языках реализован row polymorphism.
Реализовано для объектных типов в Ocaml, например
let printf = Printf.printf
class virtual a =
object
method virtual f : unit
end
type b =
<
f : unit
>
let consume_a (x : a) =
printf "consume_A: " ;
x #f ;
print_newline ()
let consume_b (x : b) =
printf "consume_B: " ;
x #f ;
print_newline ()
let consume_c (x : < f : unit ; .. >) =
printf "consume_C: " ;
x #f ;
print_newline ()
class some_a =
object
method f =
printf "some A object"
end
let b =
object
method f =
printf "object B"
end
let main () =
let a = new some_a in
consume_a a ;
consume_a b ;
consume_b a ;
consume_b b ;
consume_c a ;
consume_c b
let () = main ()Примерно схожим образом работает утиная типизация интерфейсов в Go и протоколы/категории в Objective-C (вроде бы и в Swift тоже).