Прежде чем ответить на ваш первый вопрос, отмечу, что у вас есть два вопроса здесь.В будущем попробуйте задать два отдельных вопроса о переполнении стека, если у вас есть два вопроса.Как вы могли заметить, когда вы задаете два вопроса в одном, часто второй вопрос игнорируется почти всеми.
Я был удивлен, узнав, что экземпляры интерфейса могут быть созданы как
Iinterface myDimensions = (Iinterface) myBox;
Как распределяется память для этого типа оператора?Выделена ли память в куче?
Как уже отмечали другие, это не обязательно создание экземпляра типа, который реализует интерфейс.Кажется, что все забыли в спешке сказать вам, что эталонные преобразования не выделяют память , это то, что бокс-преобразования действительно выделяют память .Если myBox имеет тип struct, то это выделит память в куче для «обертки» и создаст копию значения в обертке.Затем оболочка реализует интерфейс.
Переходя ко второму вопросу:
Класс, реализующий интерфейс, может явно реализовать член этого интерфейса.Когда член явно реализован, к нему нельзя получить доступ через экземпляр класса, а только через экземпляр интерфейса.Почему такое ограничение применяется в языке?
Цель явной реализации интерфейса состоит в том, чтобы позволить классу реализовать определенный интерфейс, не требуя, чтобы эти методы отображались местамиони не нужны.Например, предположим, что у вас есть:
class MyConnection : IDisposable
{
public void OpenConnnection() { ... }
public void CloseConnection() { ... }
public void Dispose() { ... CloseConnection(); ... }
}
Если удаление открытого соединения такое же, как закрытие соединения, то вы, вероятно, не хотите вводить пользователей в заблуждение, либо (1) имея два метода, которые делают то же самоевещь, или (2) имеющий метод OpenConnection в паре с неочевидным именем, таким как Dispose.Позволяя вам сделать Dispose «невидимым», если объект не конвертирован в IDisposable, тогда вы упростите пользователям поиск правильных действий.
Другое обстоятельство, при котором вы используете это, - это когда у вас естьдва интерфейса с одинаковыми именами:
interface IFoo { void M(); }
interface IBar { void M(); }
Теперь, как создать класс C, который реализует как IFoo, так и IBar, но имеет разные реализации для двух методов M?Вы должны использовать явную реализацию для одного или обоих из них, если вам нужны два разных тела.