In C#, la classe A
contiene un metodo pubblico Foo()
che esegue qualche elaborazione e restituisce un valore. protected
metodo Bar()
, anche nella classe A
esegue la stessa logica di Foo()
, seguita da un'ulteriore elaborazione e quindi restituisce un valore.Metodo call base anziché override
Per evitare la duplicazione del codice, Bar()
chiama Foo()
e utilizza il reso come valore intermedio.
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;
}
}
Classe B
eredita da A
e sostituisce Foo()
. L'override chiama l'implementazione della classe base di Bar()
.
class B : A
{
public override String Foo()
{
base.Bar();
}
}
questo (ovviamente) entra in un ciclo infinito finché il computer esaurisce la memoria e poi produce un'eccezione di overflow dello stack.
La soluzione più ovvia è riscrivere A con un metodo privato FooInternals
che contiene il coraggio di Foo. Foo e Bar vengono quindi modificati per utilizzare i risultati di tale metodo.
C'è un modo per forzare A's Bar()
per chiamare A Foo()
anziché l'override?
(sono quasi certamente essendo troppo intelligente qui; questa va completamente contro il polimorfismo ma non riesco a resistere alla tentazione di provare a spingere un po 'oltre la mia conoscenza..)
Grazie, ho capito che era l'approccio migliore/ovvio. Mi stavo solo chiedendo se avrei potuto perdere un'alternativa. – ThatBlairGuy
@ThatBlairGuy: Siamo spiacenti, sono riuscito a saltare il paragrafo nella tua risposta che lo descrive. Oops :) Ma no, questo è tutto quello che puoi fare davvero. –
Nessun problema, grazie per aver verificato che non stavo trascurando qualcosa. – ThatBlairGuy