В .net, если класс A
наследуется от типа B
и объект типа A
передается в код, который ожидает объект типа B
, переданный объект не будет преобразован в B
, но останется A
. Это возможно, потому что каждый объект хранит в себе ссылку на дескриптор типа. Классы не имеют дескрипторов типов, хранящихся вместе с ними. Если бы структура типа A
могла быть передана по значению подпрограмме, ожидающей структуру типа B
, она стала бы структурой типа B
. В тех случаях, когда это было бы целесообразно, было бы более целесообразно определить расширяющий оператор преобразования от типа A
до B
.
Иногда бывает полезно передать структуру типа A
по ссылке на ожидающий тип B
. Операторы преобразования там не помогут. Однако это можно было бы сделать, хотя и несколько неловко, если бы тип структуры A
не содержал ничего, кроме поля типа B
. Затем это поле может быть передано по ссылке на ожидающую процедуру типа B
; Сложность состоит в том, что в любой доступ к полю нужно будет включать имя внутренней структуры.
Что было бы полезно, не только для структур, но и для классов, было бы понятием «тип расширения». Все классы, наследуемые или нет, могут быть расширены с помощью типа расширения, который будет включать только элементы экземпляра; переменные или значения типа расширения будут рассматриваться как объекты времени выполнения базового типа, и все преобразования между типами расширений и их базовыми типами или между типами расширений, производными от одного и того же базового типа, будут считаться «расширяющимися» и будут обрабатываются как неактивные. Единственным эффектом типа расширения будет включение в область действия элементов, определенных для этого типа. Они будут вести себя во многом как методы расширения, за исключением того, что они будут применяться только к переменным и переменным, объявленным как тип расширения, и члены типов расширения будут иметь приоритет над членами базового класса. Можно представить себе много вариантов использования таких вещей (в тех случаях, когда вы хотели бы использовать методы расширения в некоторых экземплярах класса, но, возможно, не хотите, чтобы они были доступны во всех экземплярах), но пока еще ни один из известных мне языков не поддерживает такой особенность.