«Тени» и «Переопределения» в VB.NET - PullRequest
63 голосов
/ 21 января 2009

Какое значение имеют два ключевых слова Тени и Переопределения ? Что они делают и для какого контекста предпочтительнее тот или иной?

Ответы [ 16 ]

1 голос
/ 06 июля 2015

Ну вот ответ по коду.

Module Module1

    Sub Main()
        Dim object1 As Parent = New Child()
        Console.WriteLine("object1, reference type Parent and object type Child")
        object1.TryMe1()
        object1.TryMe2()
        object1.TryMe3()

        Console.WriteLine("")
        Console.WriteLine("")
        Console.WriteLine("object2, reference type Child and object type Child")
        Dim object2 As Child = New Child()

        object2.TryMe1()
        object2.TryMe2()
        object2.TryMe3()

        Console.ReadLine()
    End Sub

End Module

Public Class Parent

    Public Sub TryMe1()
        Console.WriteLine("Testing Shadow: Parent.WriteMe1")
    End Sub

    Public Overridable Sub TryMe2()
        Console.WriteLine("Testing override: Parent.WriteMe2")
    End Sub

    Public Sub TryMe3()
        Console.WriteLine("Testing Shadow without explicitly writing shadow modifier: Parent.WriteMe3")
    End Sub
End Class

Public Class Child
    Inherits Parent

    Public Shadows Sub TryMe1()
        Console.WriteLine("Testing Shadow: Child.WriteMe1")
    End Sub

    Public Overrides Sub TryMe2()
        Console.WriteLine("Testing override: Child.WriteMe2")
    End Sub

    Public Sub TryMe3()
    Console.WriteLine("Testing Shadow without explicitly writing shadow modifier: Child.WriteMe3")
    End Sub
End Class


'Output:
'object1, reference type Parent and object type Child
'Testing Shadow: Parent.WriteMe1
'Testing override: Child.WriteMe2
'Testing Shadow without explicitly writing shadow modifier: Parent.WriteMe3


'object2, reference type Child and object type Child
'Testing Shadow: Child.WriteMe1
'Testing override: Child.WriteMe2
'Testing Shadow without explicitly writing shadow modifier: Child.WriteMe3

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

Примечание. Я никогда не использовал ссылку на базовый класс для дочернего объекта. Для таких случаев я всегда использую интерфейсы.

0 голосов
/ 20 июня 2016

Использование Теней редко, но верно. Кроме того, вы не можете переопределить общий (статический) метод. Поэтому вы должны создать теневой метод с общим доступом, если хотите переопределить его.

0 голосов
/ 14 октября 2015

Тени могут быть очень полезны, если вы пишете обертку вокруг существующего элемента управления.

Например, рядом со списком. Затеняя AutoCompleteSource, вы можете помешать ему установить недопустимое значение для вашего специального вида комбобокса, даже если он приведен к обычному комбобоксу. Или выполните некоторую предварительную обработку, прежде чем использовать mybase.AutoCompleteSource = value в свойстве теневого копирования.

0 голосов
/ 04 февраля 2010

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

0 голосов
/ 21 января 2009

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

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

0 голосов
/ 21 января 2009

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

Мне не нужны тени. Придерживайтесь переопределений. Эти полезные маленькие «функции», которые VB предоставил на протяжении многих лет, всегда в какой-то момент вызывают у вас горе.

...