.NET: Наследование типа типа - технические ограничения?
Мне интересно, есть ли какие-либо технические причины для того, почему типы значений .NET не поддерживают наследование (без учета реализации интерфейса)... Я не могу на первый взгляд подумать о причине, почему типы значений не должны допускать одиночных наследование базового класса.
(Я имею в виду, возможно, наследование типов значений было бы плохо, если бы у вас была огромная иерархия наследования, но мне в основном интересно, существуют ли ограничения времени выполнения, а не практические ограничения.)
Спасибо.
Ответы
Ответ 1
Рассмотрим память, выделенную для типа значения. CLR точно знает, сколько места выделяется для переменной типа значения, потому что она знает, какие поля будут. Он не может иметь значение подтипа с большим количеством полей.
Теперь у нас может быть наследование типов значений, которое просто усекало вещи:
ExtendedValueType evt = new ExtendedValueType(...);
BaseValueType bvt = evt;
// Now you couldn't cast back to ExtendedValueType, because we'd have lost
// information
Кроме того, нигде для информации о типе жить в самом значении нет, поэтому любые виртуальные методы, переопределенные расширенным типом, не будут вызываться через bvt
, потому что, насколько все это имеет значение, значение тогда равно значению of BaseValueType
. Другими словами, многие "естественные" функции наследования будут отсутствовать таким образом, который, как я думаю, вызовет много путаницы.
Ответ 2
Я считаю, что причина, по которой типы значений не поддерживают наследование, связана с тем, как они представлены в памяти. Размер и, следовательно, данные, представленные типом значения, зависят от его составных полей. То есть, если ваш тип значения содержит int и строку, общий размер в 32-битной системе будет 8 или 4 (размер int) + 4 (размер указателя). Это означает, что типы значений, представленные в памяти, представляют собой блок байтов без дополнительной информации.
Теперь контрастируем с типами классов, это все размеры указателей или 4 на 32-битных системах. Поскольку экземпляры типов классов являются указателями, они могут затем ссылаться на вещи, которые вам нужны для наследования, например, на виртуальную таблицу виртуальных машин (VMT) и ссылку на информацию о родительских классах. Это то, что тип значения не может сделать, и, следовательно, почему типы значений не поддерживают наследование.
Ответ 3
Предположим, что это можно сделать.
Вы сможете повторно использовать некоторую реализацию.
Но реальными преимуществами наследования являются подстановка и полиморфизм. Они требуют использования по ссылке.
И именно поэтому поддержка интерфейса поддерживается, потому что он всегда включает в себя Бокс. Но это не было бы для наследования.