Mam klasę, która jest generowana przez niektóre narzędzia, dlatego nie mogę go zmienić. Wygenerowany klasa jest bardzo proste (bez interfejsu, nie ma metody wirtualne):Jak wymusić wywołanie metody pochodnej C#
class GeneratedFoo
{
public void Write(string p) { /* do something */ }
}
W projekcie C#, chcemy zapewnić sposób, tak, że możemy podłączyć inną realizację MyFoo. Więc myślę, aby MyFoo pochodzący z GeneratedFoo
class MyFoo : GeneratedFoo
{
public new void Write(string p) { /* do different things */ }
}
Następnie Mam metodę CreateFoo że albo będzie zwracać instancję GeneratedFoo lub klasy MyFoo. Jednak zawsze wywołuje metodę w GeneratedFoo.
GeneratedFoo foo = CreateFoo(); // if this returns MyFoo,
foo.Write("1"); // it stills calls GeneratedFoo.Write
To jest rozszerzone, ponieważ nie jest to metoda wirtualna. Ale zastanawiam się, czy istnieje sposób (może to hack), aby wywołać metodę pochodną.
Dzięki,
Ian
"publiczna nowa pustka"? Jest to użycie "nowego", którego nigdy wcześniej nie widziałem. Czy to jest nawet ważne? – abelenky
"Nowy" tutaj oznacza, że masz jawnie "zakryty" metodę z klasy bazowej, bez jej przesłonięcia (ponieważ nie jest to wirtualne) - bez niej faktycznie otrzymasz ostrzeżenie od kompilatora. –
Aby być bardziej szczegółowym - gdy podasz metodę w klasie pochodnej o takiej samej nazwie jak w bazie, a nie jest to metoda nadpisywania, kompilatory dają ostrzeżenie, że twoja metoda ukrywa dziedziczonego członka (ponieważ prawdopodobnie nie chciałaś tego zrobić), ale jeśli jesteś tego pewien, mówisz to kompilatorowi, używając słowa kluczowego "new". –