Из экземпляра Child вызывается метод базового класса, который был переопределен - PullRequest
8 голосов
/ 29 октября 2008

Рассмотрим следующий код:

Public Class Animal

Public Overridable Function Speak() As String
    Return "Hello"
End Function

End Class

Public Class Dog
    Inherits Animal

    Public Overrides Function Speak() As String
        Return "Ruff"
    End Function

End Class

Dim dog As New Dog
Dim animal As Animal
animal = CType(dog, Animal)
// Want "Hello", getting "Ruff"
animal.Speak()

Как я могу преобразовать / ctype экземпляр Dog в Animal и вызвать функцию Animal.Speak?

Ответы [ 5 ]

11 голосов
/ 29 октября 2008

Вы не; метод подкласса переопределяет метод суперкласса по определению наследования.

Если вы хотите, чтобы переопределенный метод был доступен, предоставьте его в подклассе, например,

Public Class Dog 
    Inherits Animal
    Public Overrides Function Speak() As String
        Return "Ruff"
    End Function
    Public Function SpeakAsAnimal() As String
        Return MyBase.Speak()
    End Function
End Class
1 голос
/ 29 октября 2008

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

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

MyBase.Speak()

, который вызвал бы реализацию родительского класса, но снаружи класса Dog нет способа сделать это.

0 голосов
/ 22 декабря 2014

Я знаю, что это было опубликовано несколько месяцев назад, но я все еще собираюсь попытаться ответить, возможно, просто для полноты.

Вам сказали, что вы можете получить доступ к переопределенному методу из в классе dog, и что вы можете затем предоставить его под другим именем. Но как насчет использования условного?

Вы можете просто сделать:

Public Class Animal

Public Overridable Function Speak(Optional ByVal speakNormal as Boolean = False) As String
    Return "Hello"
End Function

End Class

Public Class Dog
    Inherits Animal

    Public Overrides Function Speak(Optional ByVal speakNormal as Boolean = False) As String
        If speakNormal then
            return MyBase.Speak()
        Else
            Return "Ruff"
        End If
    End Function

End Class

А затем назовите их как:

Dim dog As New Dog
Dim animal As new Animal
animal.Speak() //"Hello"
dog.Speak()//"Ruff"
dog.Speak(true)//"Hello"

Кроме того, вы можете getTheAnimalInTheDog и сделать it Speak():

Вы можете просто сделать:

Public Class Animal

Public Overridable Function Speak() As String
    Return "Hello"
End Function

Public MustOverride Function GetTheAnimalInMe() As Animal

End Class

Public Class Dog
    Inherits Animal

    Public Overrides Function Speak() As String
        Return "Ruff"
    End Function

    Public Overrides Function GetTheAnimalInMe() As Animal
        Dim a As New Animal
        //Load a with the necessary custom parameters (if any)
        Return a
    End Function
End Class

А потом еще раз:

Dim dog As New Dog
Dim animal As new Animal
animal.Speak() //"Hello"
dog.Speak()//"Ruff"
dog.GetTheAnimalInMe().Speak()//"Hello"

Надеюсь, это поможет;)

0 голосов
/ 26 ноября 2008

Я думаю, что если вы выберете «Перезаписать» и поменять «Переопределить» на «Новый», вы получите то, что хотите.

Public Class Animal

Public Function Speak() As String
    Return "Hello"
End Function

End Class

Public Class Dog
    Inherits Animal

    Public New Function Speak() As String
        Return "Ruff"
    End Function

End Class

Dim dog As New Dog
Dim animal As Animal
dog.Speak() ' should be "Ruff"
animal = CType(dog, Animal)
animal.Speak() ' should be "Hello"
0 голосов
/ 29 октября 2008

Не думаю, что ты можешь.

Дело в том, что объект все еще собака. описываемое вами поведение (получение «ерша» от заброшенного объекта, а не «привет») является стандартным, потому что вы хотите иметь возможность использовать класс животных, чтобы позволить группе животных другого типа говорить.

Например, если у вас был третий класс как:

Public Class Cat
    Inherits Animal

    Public Overrides Function Speak() As String
        Return "Meow"
    End Function
End Class

Тогда вы сможете получить к ним доступ следующим образом:

protected sub Something
    Dim oCat as New Cat
    Dim oDog as New Dog

    MakeSpeak(oCat)
    MakeSpeak(oDog)
End sub

protected sub MakeSpeak(ani as animal)
    Console.WriteLine(ani.Speak())
end sub 

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...