Подтвердить что ты не робот

.NET: Наследование типа типа - технические ограничения?

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

(Я имею в виду, возможно, наследование типов значений было бы плохо, если бы у вас была огромная иерархия наследования, но мне в основном интересно, существуют ли ограничения времени выполнения, а не практические ограничения.)

Спасибо.

4b9b3361

Ответ 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

Предположим, что это можно сделать.

Вы сможете повторно использовать некоторую реализацию.
Но реальными преимуществами наследования являются подстановка и полиморфизм. Они требуют использования по ссылке.

И именно поэтому поддержка интерфейса поддерживается, потому что он всегда включает в себя Бокс. Но это не было бы для наследования.