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

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

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

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

Сообщества

Настроить S2

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



Пишет yigal_s ([info]yigal_s)
@ 2010-08-20 21:54:00


Previous Entry  Add to memories!  Tell a Friend!  Next Entry
шифером шурша (программистское)
Интересно было б придумать два таких интерфейса A и B, состоящие из поднабора методов A1, A2 и B1 и B2, таких что по подинтерфейсам A1 был бы подтипом B1, а A2 был бы супертипом B2.

Вот, скажем, с точки зрения константных методов, квадрат есть подтип прямоугольника, с другой стороны, если рассмотреть модифицирующую операцию масштабирования, то у квадрата она будет одна - масштабирование с одинаковым коэффициеном по обеим осям, а у прямоугольника можно было бы определить две операции - масштабирование с одним коэффициентом, как у квадрата, и масштабирование с двумя коэффициентами. Соответственно, относительно интерфейсов масштабирования, прямоугольник будет подтипом квадрата.

Несколько надуманно, пожалуй. Сомнительно.

Возьмем чего попроще. Действительные и комплексные числа. Относительно константных операций, действительные числа можно применять там, где применимы комплексные, то есть, константный действительный тип - подтип комплексного. Если же рассмотреть операцию присваивания (комплексному числу - комплексного, а действителного - действительному), то окажется, что как раз комплексное число можно применять в качестве левого операнда операции присваивания там, где применимо действительное. Но не наоборот.

Впрочем, тут я подменяю тип правого операнда.

ОК. Подойдем к задаче математически. Формально. Схоластически.

Поскольку пустой интерфейс E заведомо является супертипом для любого непустого интерфейса, определим наши интерфейсы следующим образом:
A1 = A
A2 = E
B1 = E
B2 = B

Уря! Задача решена.

Сим, между прочим, доказано (увы, на вырожденном примере пустого интерфейса), что понятие наследования типа есть понятие не вполне достаточное для типизированного объектно ориентированного программирования, поскольку соотношение интерфейсов может не исчерпываться отношением супертип-подтип, при том, что такое отношение супертип-подтип существует для отдельных методов или их групп.


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


[info]spamsink@lj
2010-08-20 23:00 (ссылка)
http://en.wikipedia.org/wiki/Covariance_and_contravariance_(computer_science)

(Ответить) (Ветвь дискуссии)


[info]yigal_s@lj
2010-08-20 23:22 (ссылка)
понятия ко- и контр-вариантности строятся уже поверх базового отношения тип-подтип, которому я, собственно, и посвятил этот пост.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]spamsink@lj
2010-08-21 01:48 (ссылка)
Я к тому, что т.к. и ковариантные и контравариантные операции в любом случае нужны, то что кому подтип - по большому счету дело вкуса. Один фиг, что крашеная блондинка - это блондинка с дополнительной степенью свободы - цветом волос, что блондинка - это крашеная блондинка, которая еще не покрасилась.

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


[info]yigal_s@lj
2010-08-20 23:22 (ссылка)
понятия ко- и контр-вариантности строятся уже поверх базового отношения тип-подтип, которому я, собственно, и посвятил этот пост.

(Ответить)


[info]juan_gandhi@lj
2010-08-21 00:00 (ссылка)
Я на эту тему большую писанину писал: Not Just Subtyping (http://vpatryshev.blogspot.com/2009/11/not-just-subtyping.html)

(Ответить)