W języku C# klasa A
zawiera publiczną metodę Foo()
, która wykonuje pewne przetwarzanie i zwraca wartość. protected
metoda Bar()
, również w klasie A
wykonuje tę samą logikę co Foo()
, po której następuje dodatkowe przetwarzanie, a następnie zwraca wartość.Metoda wywołania podstawowego zamiast zastąpienia
Aby uniknąć powielania kodu, Bar()
wywołuje Foo()
i używa zwrotu jako wartości pośredniej.
class A
{
public virtual String Foo()
{
String computedValue;
// Compute the value.
return computedValue;
}
protected String Bar()
{
String computedValue;
String intermediateValue = Foo();
/// More processing to create computedValue from intermediateValue.
return computedValue;
}
}
Klasa B
dziedziczy z A
i nadpisuje Foo()
. Zastąpienie wywołuje implementację klasy podstawowej Bar()
.
class B : A
{
public override String Foo()
{
base.Bar();
}
}
To (oczywiście) przechodzi w nieskończoną pętlę, aż do wyczerpania pamięci komputera, a następnie wygeneruje wyjątek przepełnienia stosu.
Najbardziej oczywistym rozwiązaniem jest przepisanie A za pomocą prywatnej metody FooInternals
, która zawiera odwagę Foo. Foo i Bar są następnie modyfikowane, aby wykorzystać wyniki tej metody.
Czy istnieje sposób na wymuszenie A Bar()
na wywołanie A Foo()
zamiast przesłonięcia?
(jestem prawie na pewno jest zbyt mądry tutaj; to idzie całkowicie przeciwko polimorfizmu Ale nie mogę oprzeć się pokusie, aby spróbować popychając moją wiedzę nieco dalej..)
Dzięki, pomyślałem, że to było najlepsze/oczywiste podejście. Zastanawiam się, czy nie przeoczyłem alternatywy. – ThatBlairGuy
@ThatBlairGuy: Przepraszam, udało mi się ominąć akapit w twojej odpowiedzi, który to opisuje. Ups :) Ale nie, to wszystko, co możesz zrobić naprawdę. –
Bez obaw, dziękuję za weryfikację, że czegoś nie przeoczyłem. – ThatBlairGuy