Почему структура не может быть получена из другой структуры? - PullRequest
8 голосов
/ 02 марта 2012

Меня больше интересует ответ с точки зрения .Net и CLR:

Почему структура не может быть базовым классом другой структуры или наоборот?

Ответы [ 2 ]

13 голосов
/ 02 марта 2012

Структуры занимают слоты фиксированного размера в стеке (или там, где они живут).

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

Можно было бы унаследовать членов от других структур, но, поскольку вы не сможете заниматься каким-либо полиморфизмом, путаница не стоит.

1 голос
/ 06 марта 2012

В .net, если класс A наследуется от типа B и объект типа A передается в код, который ожидает объект типа B, переданный объект не будет преобразован в B, но останется A. Это возможно, потому что каждый объект хранит в себе ссылку на дескриптор типа. Классы не имеют дескрипторов типов, хранящихся вместе с ними. Если бы структура типа A могла быть передана по значению подпрограмме, ожидающей структуру типа B, она стала бы структурой типа B. В тех случаях, когда это было бы целесообразно, было бы более целесообразно определить расширяющий оператор преобразования от типа A до B.

Иногда бывает полезно передать структуру типа A по ссылке на ожидающий тип B. Операторы преобразования там не помогут. Однако это можно было бы сделать, хотя и несколько неловко, если бы тип структуры A не содержал ничего, кроме поля типа B. Затем это поле может быть передано по ссылке на ожидающую процедуру типа B; Сложность состоит в том, что в любой доступ к полю нужно будет включать имя внутренней структуры.

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

...