Sto solo eseguendo NDepend contro un codice che ho scritto e uno degli avvertimenti è Overrides of Method() should call base.Method()
.
Le posizioni in cui questo si verifica sono dove ho una classe base che ha proprietà e metodi virtuali con comportamento default ma che può essere sovrascritta da una classe che eredita dalla classe base e non chiama metodo sottoposto a override.
Ad esempio, nella classe base ho una proprietà definita in questo modo:
protected virtual char CloseQuote
{
get
{
return '"';
}
}
E poi in una classe ereditaria che usa una citazione di chiusura diversa:
protected override char CloseQuote
{
get
{
return ']';
}
}
Non tutte le classi che ereditano dalla classe base usano caratteri di virgoletta diversi, quindi il mio progetto iniziale.
Le alternative a cui pensavo erano proprietà get / set nella classe base con i valori di default impostati nel costruttore:
protected BaseClass()
{
this.CloseQuote = '"';
}
protected char CloseQuote { get; set; }
public InheritingClass()
{
this.CloseQuote = ']';
}
Oppure fai in modo che la classe base richieda i valori come argomenti del costruttore:
protected BaseClass(char closeQuote, ...)
{
this.CloseQuote = '"';
}
protected char CloseQuote { get; private set; }
public InheritingClass()
base (closeQuote: ']', ...)
{
}
Devo usare virtual
in uno scenario in cui l'implementazione di base può essere sostituita anziché estesa o dovrei optare per una delle alternative che ho pensato? Se sì, quale sarebbe preferibile e perché?