2012-03-02 2 views

ответ

12

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

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

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

+4

Это не исключает синтаксиса шаблонов, хотя, когда вы унаследовали от структуры, вы получили копию всех методов, свойств и полей. Он не был бы совместимым с присваиванием, но он имел бы тот же макет плюс любые дополнительные материалы, которые вы добавили в «потомок». Наверное, этого достаточно, но это было бы странно. –

+4

Два слова: объект нарезки. http://en.wikipedia.org/wiki/Object_slicing –

+2

@ LasseV.Karlsen: Точно. Если бы это было поддержано, этот вопрос был бы «Почему я не могу написать« Base b = new Derived() »? – SLaks

1

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

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

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

Смежные вопросы