шифером шурша (программистское)
Aug. 20th, 2010 09:54 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Интересно было б придумать два таких интерфейса A и B, состоящие из поднабора методов A1, A2 и B1 и B2, таких что по подинтерфейсам A1 был бы подтипом B1, а A2 был бы супертипом B2.
Вот, скажем, с точки зрения константных методов, квадрат есть подтип прямоугольника, с другой стороны, если рассмотреть модифицирующую операцию масштабирования, то у квадрата она будет одна - масштабирование с одинаковым коэффициеном по обеим осям, а у прямоугольника можно было бы определить две операции - масштабирование с одним коэффициентом, как у квадрата, и масштабирование с двумя коэффициентами. Соответственно, относительно интерфейсов масштабирования, прямоугольник будет подтипом квадрата.
Несколько надуманно, пожалуй. Сомнительно.
Возьмем чего попроще. Действительные и комплексные числа. Относительно константных операций, действительные числа можно применять там, где применимы комплексные, то есть, константный действительный тип - подтип комплексного. Если же рассмотреть операцию присваивания (комплексному числу - комплексного, а действителного - действительному), то окажется, что как раз комплексное число можно применять в качестве левого операнда операции присваивания там, где применимо действительное. Но не наоборот.
Впрочем, тут я подменяю тип правого операнда.
ОК. Подойдем к задаче математически. Формально. Схоластически.
Поскольку пустой интерфейс E заведомо является супертипом для любого непустого интерфейса, определим наши интерфейсы следующим образом:
A1 = A
A2 = E
B1 = E
B2 = B
Уря! Задача решена.
Сим, между прочим, доказано (увы, на вырожденном примере пустого интерфейса), что понятие наследования типа есть понятие не вполне достаточное для типизированного объектно ориентированного программирования, поскольку соотношение интерфейсов может не исчерпываться отношением супертип-подтип, при том, что такое отношение супертип-подтип существует для отдельных методов или их групп.
Вот, скажем, с точки зрения константных методов, квадрат есть подтип прямоугольника, с другой стороны, если рассмотреть модифицирующую операцию масштабирования, то у квадрата она будет одна - масштабирование с одинаковым коэффициеном по обеим осям, а у прямоугольника можно было бы определить две операции - масштабирование с одним коэффициентом, как у квадрата, и масштабирование с двумя коэффициентами. Соответственно, относительно интерфейсов масштабирования, прямоугольник будет подтипом квадрата.
Несколько надуманно, пожалуй. Сомнительно.
Возьмем чего попроще. Действительные и комплексные числа. Относительно константных операций, действительные числа можно применять там, где применимы комплексные, то есть, константный действительный тип - подтип комплексного. Если же рассмотреть операцию присваивания (комплексному числу - комплексного, а действителного - действительному), то окажется, что как раз комплексное число можно применять в качестве левого операнда операции присваивания там, где применимо действительное. Но не наоборот.
Впрочем, тут я подменяю тип правого операнда.
ОК. Подойдем к задаче математически. Формально. Схоластически.
Поскольку пустой интерфейс E заведомо является супертипом для любого непустого интерфейса, определим наши интерфейсы следующим образом:
A1 = A
A2 = E
B1 = E
B2 = B
Уря! Задача решена.
Сим, между прочим, доказано (увы, на вырожденном примере пустого интерфейса), что понятие наследования типа есть понятие не вполне достаточное для типизированного объектно ориентированного программирования, поскольку соотношение интерфейсов может не исчерпываться отношением супертип-подтип, при том, что такое отношение супертип-подтип существует для отдельных методов или их групп.