Я не полагал бы, что Тени действительно понятие ООП. Переопределения указывают на обеспечение новой или дополнительной функциональности для метода/свойства и т.д., который был объявлен в классе предка. Тени действительно обманывают компилятор в размышление, что родительский метод/свойство и т.д. даже не существует.
мне не нравятся Тени. Придерживайтесь Переопределений. Эти типы полезных небольших "функций", которые VB обеспечивал в течение многих лет всегда, заканчивают тем, что вызвали Вас горе в какой-то момент.
Я соглашаюсь с Jim. Я никогда не находил законное использование для Теней, также. Обычно, если я вижу его, я предполагаю, что подраздел кода должен быть пересмотрен немного.
я предполагаю, что это там так, чтобы Вы могли тень метод от блока, в котором Вы не управляете исходным кодом. В этом случае рефакторинг родительского класса был бы невозможен.
Переопределения - Расширение или создание альтернативной функциональности для метода.
Пример: Добавьте или расширил функциональность события Paint окна.
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
MyBase.OnPaint(e) ' retain the base class functionality
'add code for extended functionality here
End Sub
Тени - Переопределяют унаследованный метод и вызывают его использование для всех классов, инстанцированных с тем типом. Другими словами, метод не перегружен, но переопределен, и методы базового класса не доступны, таким образом вызывая использование функции, объявленной в классе. Тени сохраняют или сохраняют определение метода, таким образом, что это не уничтожается, если методы базового класса изменяются.
Пример: Вынудите все "B" классы использовать, это - чудак, Добавляет определение, таким образом, что, если класс Добавляет, методы изменяются, это не будет влиять на B, добавляют. (Скрывается, весь базовый класс "Добавляют" методы. Не будет в состоянии назвать A.Add (x, y, z) от экземпляра B.)
Public Class A
Public Function Add(ByVal x As Integer, ByVal y As Integer) As Integer
Return x + y
End Function
Public Function Add(ByVal x As Integer, ByVal y As Integer, ByVal z As Integer) As Integer
Return x + y + z
End Function
End Class
Public Class B
Inherits A
Public Shadows Function Add(ByVal x As Integer, ByVal y As Integer) As Integer
Return x - y
End Function
End Class
Переопределения более нормальный спецификатор. Если дочерний класс переопределяет функцию базового класса таким образом, то независимо от того, как на дочерний объект ссылаются (использующий или базовый класс или ссылку дочернего класса) это - дочерняя функция, которая вызвана.
, С другой стороны, если функция дочернего класса Тени функция базового класса, то дочерний объект получил доступ через ссылку базового класса, будет использовать ту функцию базового класса, несмотря на то, чтобы быть дочерним объектом.
дочернее функциональное определение только используется, если к дочернему объекту получают доступ с помощью дочерней ссылки соответствия.
Пример затенения: Предположим, вы хотите использовать функцию в стороннем компоненте, но функция защищена. Вы можете обойти это ограничение с помощью простого наследования и предоставления теневой функции, которая в основном вызывает свою базовую функцию:
Public Class Base
Protected Sub Configure()
....
End Sub
End Class
Public Class Inherited
Inherits Base
Public Shadows Sub Configure()
MyBase.Configure()
End Sub
End Class
Это недавняя ссылка MSDN: Различия между затенением и переопределением
Затенение защищает от последующей модификации базового класса, которая вводит член, который вы уже определили в производном классе. Обычно затенение используется в следующих случаях:
** Вы ожидаете, что ваш базовый класс может быть изменен, чтобы определить элемент с тем же именем, что и ваш. *
** Вы хотите свободу изменения типа элемента или вызывающая последовательность. *
(мне еще предстоит исследовать использование в отношении объема и типов)
Я хотел использовать System.Web.HttpContext.Current.Response
вместо ] Response.redirect
, и требовалось удобство кодирования как Response.redirect
. Я определил свойство только для чтения с именем Response
, чтобы затенять оригинал в базовом классе. Я не мог использовать переопределения, так как это свойство нельзя переопределить. Очень удобно :)