Czy istnieje sposób wywołania wersji nadrzędnej zastępowanej metody? (C # .Net)
W poniższym kodzie próbowałem uzyskać dostęp do wersji nadrzędnej metody methodTwo na dwa sposoby, ale wynik zawsze wynosił 2. Czy istnieje sposób uzyskania wyniku 1 z instancji ChildClass bez zmiany tych dwóch klas?
class ParentClass
{
public int methodOne()
{
return methodTwo();
} virtual public int methodTwo()
{
return 1;
}
}class ChildClass : ParentClass
{
override public int methodTwo()
{
return 2;
}
}class Program
{
static void Main(string[] args)
{
var a = new ChildClass();
Console.WriteLine("a.methodOne(): " + a.methodOne());
Console.WriteLine("a.methodTwo(): " + a.methodTwo());
Console.WriteLine("((ParentClass)a).methodTwo(): "
+ ((ParentClass)a).methodTwo());
Console.ReadLine();
}
}
Update
ChrisW opublikował to:
Poza klasą, nie wiem
niełatwy sposób; ale może nie jestem
wiesz, co się stanie, jeśli spróbujesz
refleksja: użyj
metoda Type.GetMethod, aby znaleźć MethodInfo,
skojarzone z metodą w klasie.
ParentClass, a następnie zadzwoń
MethodInfo.Invoke
Ta odpowiedź została usunięta. Zastanawiam się, czy ten hack może zadziałać, tylko z ciekawości.
Nie znaleziono powiązanych wyników
Zaproszony:
Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się
8 odpowiedzi
Anonimowy użytkownik
Potwierdzenie od:
Poza klasą wywołanie
wywoła . To jest cały powód istnienia metod wirtualnych.
Anonimowy użytkownik
Potwierdzenie od:
edit
cerować! środowisko wykonawcze zatrzymuje Cię: : "operacja może zdestabilizować środowisko wykonawcze"; usuń i działa dobrze; za sprytny o połowę ...)
Wewnątrz typu możesz użyć - jednak nie jest to możliwe z zewnątrz. Nie możesz też zejść o więcej niż jeden poziom - nie ma wsparcia dla .
Jeśli jednak wyłączysz polimorfizm metodą ukrywania, możesz uzyskać pożądany
odpowiedź
ale ze złych powodów:
Możesz teraz uzyskać inną odpowiedź z tego samego obiektu w zależności od tego, czy zmienna jest zdefiniowana jako czy .
Anonimowy użytkownik
Potwierdzenie od:
Aby uzyskać więcej informacji i pełną próbkę, zobacz
http://kennethxu.blogspot.cz/2009/05/ site cnet-Calls-grandpa-virtual-method.html
http://kennethxu.blogspot.cz/2 ... .html
Dziękuję Kenneth Xu!
Anonimowy użytkownik
Potwierdzenie od:
W moim przypadku klasa potomna wprowadziła koncepcję peera i musiałem nadpisać ją za pomocą , aby wywołać wersję podstawową na peerze. Jednak odrzucając to, ukrył to ... A może tak? Ta technika przyszła na ratunek.
Anonimowy użytkownik
Potwierdzenie od:
Powyższy kod pomyślnie zastępuje metodę nadrzędną, ale wartość metody nadrzędnej pozostaje niezmieniona.
Możesz zwrócić wartości z obu
klasa rodzicielska
i od
klasa podrzędna
używając poniższego kodu -
Ale program Visual Studio wyświetli ostrzeżenie w czasie kompilacji.
Anonimowy użytkownik
Potwierdzenie od:
Anonimowy użytkownik
Potwierdzenie od:
To jest istota dziedziczenia, polimorfizm ...
Anonimowy użytkownik
Potwierdzenie od:
Umieść odpowiednią funkcjonalność w klasie nadrzędnej w metodzie statycznej z wymaganymi parametrami. Metoda w tej klasie może ją wywołać, więc nie musi powielać funkcji, a klasa potomna może wywołać tę funkcję, jeśli to konieczne, za pomocą metody statycznej. Można więc to zrobić nawet wewnątrz metody i określić, którą konkretną klasę chce wywołać. Ponadto może mieć dostęp do przodków bardziej odległych niż tylko rodzice, co jest ograniczeniem w używaniu słowa „baza”.