2.2.2 Семантика присваиванияРассмотрим присваивание: x = e. Чтобы присваивание было допустимым, типы переменной x и выражения e должны быть согласованными. Пусть сущность x согласно объявлению принадлежит классу T. Будем говорить, что тип Ti основан на классе T и является базовым типом x, так что базовый тип определяется классом объявления. Пусть теперь в рассматриваемом нами присваивании выражение e связано с объектом типа Ti. Тип Ti согласован по присваиванию с базовым типом T переменной x, если класс Ti является потомком класса T. Присваивание допустимо, если и только если имеет место согласование типов. Например, пусть задан некоторый класс Parent, а класс Child - его потомок, объявленный следующим образом: class Child : Parent {...} Пусть теперь в некотором классе объявлены переменные этих классов и созданы связанные с ними объекты: Parent pi = new Parent(), p2 = new Parent(); Тогда допустимы присваивания: pi = p2; p2 = pi; chi = ch2; ch2 = chi; pi = chi; pi = ch2; Но недопустимы присваивания: chi = pi; ch2 = pi; ch2 = p2; Отметим, что потомок может вернуть себе переданный родителю объект, задав явное преобразование. Так что следующие присваивания допустимы: pi = chi; ... chi = (Child)pi; Семантика присваивания справедлива и для другого важного случая - при рассмотрении соответствия между формальными и фактическими аргументами процедур и функций. Если формальный аргумент согласно объявлению имеет тип T, а выражение, задающее фактический аргумент, имеет тип Ti , то имеет место согласование типов формального и фактического аргумента, если и только если класс Ti является потомком класса T. Отсюда незамедлительно следует, что если формальный параметр процедуры принадлежит классу Object, то фактический аргумент может быть выражением любого типа.
|