'Тени' по сравнению с 'Переопределениями' в VB.NET

64
задан tshepang 28 February 2014 в 08:41
поделиться

7 ответов

Я не полагал бы, что Тени действительно понятие ООП. Переопределения указывают на обеспечение новой или дополнительной функциональности для метода/свойства и т.д., который был объявлен в классе предка. Тени действительно обманывают компилятор в размышление, что родительский метод/свойство и т.д. даже не существует.

мне не нравятся Тени. Придерживайтесь Переопределений. Эти типы полезных небольших "функций", которые VB обеспечивал в течение многих лет всегда, заканчивают тем, что вызвали Вас горе в какой-то момент.

-13
ответ дан Jim Petkus 24 November 2019 в 15:47
поделиться

Я соглашаюсь с Jim. Я никогда не находил законное использование для Теней, также. Обычно, если я вижу его, я предполагаю, что подраздел кода должен быть пересмотрен немного.

я предполагаю, что это там так, чтобы Вы могли тень метод от блока, в котором Вы не управляете исходным кодом. В этом случае рефакторинг родительского класса был бы невозможен.

0
ответ дан Chad Braun-Duin 24 November 2019 в 15:47
поделиться

Переопределения - Расширение или создание альтернативной функциональности для метода.

Пример: Добавьте или расширил функциональность события 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
15
ответ дан user50612 24 November 2019 в 15:47
поделиться

Переопределения более нормальный спецификатор. Если дочерний класс переопределяет функцию базового класса таким образом, то независимо от того, как на дочерний объект ссылаются (использующий или базовый класс или ссылку дочернего класса) это - дочерняя функция, которая вызвана.

, С другой стороны, если функция дочернего класса Тени функция базового класса, то дочерний объект получил доступ через ссылку базового класса, будет использовать ту функцию базового класса, несмотря на то, чтобы быть дочерним объектом.
дочернее функциональное определение только используется, если к дочернему объекту получают доступ с помощью дочерней ссылки соответствия.

87
ответ дан Nick 24 November 2019 в 15:47
поделиться

Пример затенения: Предположим, вы хотите использовать функцию в стороннем компоненте, но функция защищена. Вы можете обойти это ограничение с помощью простого наследования и предоставления теневой функции, которая в основном вызывает свою базовую функцию:

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
6
ответ дан 24 November 2019 в 15:47
поделиться

Это недавняя ссылка MSDN: Различия между затенением и переопределением

Затенение защищает от последующей модификации базового класса, которая вводит член, который вы уже определили в производном классе. Обычно затенение используется в следующих случаях:

** Вы ожидаете, что ваш базовый класс может быть изменен, чтобы определить элемент с тем же именем, что и ваш. *

** Вы хотите свободу изменения типа элемента или вызывающая последовательность. *

(мне еще предстоит исследовать использование в отношении объема и типов)

2
ответ дан 24 November 2019 в 15:47
поделиться

Я хотел использовать System.Web.HttpContext.Current.Response вместо ] Response.redirect , и требовалось удобство кодирования как Response.redirect . Я определил свойство только для чтения с именем Response , чтобы затенять оригинал в базовом классе. Я не мог использовать переопределения, так как это свойство нельзя переопределить. Очень удобно :)

0
ответ дан 24 November 2019 в 15:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: