Информация об изменениях

Сообщение 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, например

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, например

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 тоже).