* При перепечатке материалов ссылка на www.SeoLiga.ru обязательна!
Обеспечение совместимости с замещенными или скрытыми членами
8 февраля 2009
Реализация замещенного или скрытого члена базового класса становится недоступ- ной, ее заменяет новая реализация, возможно, обладающая совершенно иными ха- рактеристиками, что иногда серьезно влияет на взаимодействие с другими объекта- ми. Объект, вызывающий функцию MyMethod, объявленную в предыдущем приме- ре, ожидает значение типа String, а если функция вернет Integer, возможно возник- новение ошибки. Поэтому следует очень осторожно применять замещение и со- крытие членов и прибегать к подобным приемам, только когда вы полностью уве- рены, что они не нарушат совместимость.
В некоторых случаях получить доступ к реализации замешенных или скрытых членов базового класса все же удается. Откуда будет вызван член — из баювого класса или из производного — зависит от типа переменной, а не от объекта, как в случае переопределенного члена. Рассмотрим следующий пример: Visual Basic .NET В этом примере используются классы MyBaseClass и MylnheritedClass, 1 определенные в предыдущем примере кода. Dim X As New MyInheritedClass() Dim Y As MyBaseClass ' flepevenHb-e X и Y теперь ссылаются на один и тот же объект, ' но типы этих переменных отличаются. Y = X Тип переменной X - MylnheritedClass, поэтому в 1 следующей строке будет вызван >-лен из производного класса. X.MyMethodC'A String") Тип геременной Y - MyBaseClass, поэтому в следующей строке 1 будет вызвана реализация из базового юасса. Y.MyMethod(42) Visual C# // В этом примере используются классы MyBaseClass л MylnheritedClass, // определенные в предыдущем примере кода. MylnheritedClass X - new MylnheritedClassO; MyBaseClass Y; // Переменные X и Y теперь ссылаются на один и тот же объект, // но типы этих переменных отличаются, Y = X; // Тип переменной X -- MylnheritedClass, поэтому // в следующей строке будет вызван член из производного класса. X.MyMethod(42); // Тип переменной Y -- MyBaseClass, поэтому в следующей строке // будет вызвана реализация из базового класса. Y.MyMethod(42); Как вы видите, именно тип переменной определяет, будет ли вызван замешаю- щий член из производного класса, или исходный член из базового класса. Это по- зволяет модифицировать реализацию члена, не нарушая принципа полиморфизма. При объявлении производных классов новая реализация для замещенных или скрытых членов не наследуется, производному классу передается реализация соот- ветствующих членов из базового класса. > Как заместить (скрыть) член базового класса • Visual Basic .NET: объявите новый член с ключевым словом Shadows и напишите для него реализацию. У нового члена возможна другая сигнатура, уровень дос- тупа и тип возвращаемого значения, это может быть даже член другого типа. • С#: объявите новый член с ключевым словом new и напишите для него реализа- цию. У нового члена должны быть такие же сигнатура и тип, что и у скрытого, но уровень доступа и тип возвращаемого значения могут отличаться.