2010-02-20 15 views

Odpowiedz

13

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ć ...?

+1

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. –

+1

@Scott - znany również jako dziurkowanie. Nie żartuję. –

5

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)

Powiązane problemy