Czytałem o metodach rozszerzenia w C# 3.0. Tekst, który czytam sugeruje, że metoda rozszerzenia z tym samym podpisem co metoda w rozszerzanej klasie byłaby druga w kolejności wykonywania - to znaczy, że metoda w zapieczętowanej klasie zostaje wywołana. Jeśli tak, jak możesz rozszerzyć zapieczętowaną klasę?Jeśli metoda rozszerzenia ma taki sam podpis jak metoda w zaplombowanej klasie, jakie jest pierwszeństwo połączenia?
Odpowiedz
Rzeczywiście, metoda aktualna ma pierwszeństwo przed metodą rozszerzenia. I tylko po to, by było jasne - "porządek wykonania" sugeruje, że można nazwać oba; tylko oryginalna metoda zostanie wywołana. Być może wybierz inną nazwę/podpis; nie możesz używać metod rozszerzeń do łaty małp, jeśli to jest twoje intencje.
Jeśli istnieje jakiś interfejs bazowy/interfejs (który jest zaimplementowany), że nie ma tej metody, być może mógłbyś ją tam rzucić ...?
Użyj innego podpisu metody. Metody rozszerzeń oznaczają, że rozszerzasz zapieczętowaną klasę o nowe funkcje i nie zastępujesz tych już zaimplementowanych.
Metody rozszerzeń mają semantykę "ukryj przez nazwę" z członkami wystąpień na typie. Oznacza to, że każdy dostępny element instancji na typie zawsze będzie cieniem dla wszystkich metod rozszerzeń o tej samej nazwie, nawet jeśli metoda rozszerzenia jest lepiej dopasowana. W rezultacie, jeśli element instancji zostanie kiedykolwiek dodany do typu o tej samej nazwie, co metoda rozszerzenia, wówczas metoda rozszerzenia może zostać uznana za niemożliwą do odzyskania.
Aby uzyskać więcej informacji, zajrzyj na tym stanowisku: Extension Methods Best Practices (Extension Methods Part 6)
- 1. Czy metoda rozszerzenia jest bezpieczna?
- 2. Gradle kompilacji „No Podpis metoda”
- 3. Jakie jest znaczenie DPI w BitmapSource.Create() metoda?
- 4. metoda połączenia i wyciągnąć
- 5. Ogólna metoda w klasie abstrakcyjnej
- 6. Ogólna metoda w nietypowej klasie
- 7. metoda rozszerzenia dla metody C#
- 8. Metoda rozszerzenia C#, aby sprawdzić, czy wyliczenie ma ustawiony znacznik
- 9. Generyczna metoda podpisu i standardowy podpis identyczny
- 10. Czy dp jest taki sam jak dip?
- 11. Czy R.layout.listview jest taki sam jak R.id.listview
- 12. Czy LinqToSQL jest taki sam jak Linq?
- 13. Brak metody rozszerzenia "Pierwszy" w klasie pochodnej
- 14. Metoda rzeczywistej Podpis przy użyciu Odbicie
- 15. Metoda połączenia po pewnym opóźnieniu w java
- 16. Metoda typ zwracany w klasie wymiar java.awt
- 17. Java - Metoda połączenia przez JButton
- 18. Metoda rozszerzenia LINQ pomoc szukana II
- 19. Dlaczego metoda rozszerzenia zachowuje się inaczej?
- 20. Swift 3: transfer podpis metoda enumerateToAssignBlocks użytkowe
- 21. Ignorowanie PHP metoda __set w klasie
- 22. Metoda połączenia asynchronicznego C# okresowo
- 23. Dlaczego Alt Gr ma taki sam kod klucza jak Ctrl?
- 24. Czy metoda w klasie może być generatorem?
- 25. Metoda Repaint() wywoływania w innej klasie
- 26. Dlaczego "Brak" ma taki sam efekt jak "np.newaxis"?
- 27. Metoda rozszerzenia dla dokładnie dwóch różnych typów
- 28. metoda połączenia Hub w C# kodu
- 29. Metoda rozszerzenia dla wbudowanych typów Pythona!
- 30. Czy asynchroniczny w C# jest taki sam jak w F #?
ha ha! Monkey-patch ... to jest nowe. Ok, dzięki, myślałem, że gdybym miał rację, pękłoby szczelnie, a to by złamało cały punkt użycia zapieczętowanego. –
@Scott - znany również jako dziurkowanie. Nie żartuję. –