Se assumiamo che non sia desiderabile che la classe base sia una pura classe di interfaccia, e usando i 2 esempi dal basso, qual è un approccio migliore, usando la definizione di classe di metodo astratta o virtuale?
Il vantaggio della versione "astratta" è che probabilmente ha un aspetto più pulito e costringe la classe derivata a dare un'implementazione speranzosa significativa.
Il vantaggio della versione "virtuale" è che può essere facilmente inserito da altri moduli e utilizzato per i test senza aggiungere un mucchio di framework sottostanti come richiede la versione astratta.
Versione astratta:
public abstract class AbstractVersion
{
public abstract ReturnType Method1();
public abstract ReturnType Method2();
.
.
public abstract ReturnType MethodN();
//////////////////////////////////////////////
// Other class implementation stuff is here
//////////////////////////////////////////////
}
Versione virtuale:
public class VirtualVersion
{
public virtual ReturnType Method1()
{
return ReturnType.NotImplemented;
}
public virtual ReturnType Method2()
{
return ReturnType.NotImplemented;
}
.
.
public virtual ReturnType MethodN()
{
return ReturnType.NotImplemented;
}
//////////////////////////////////////////////
// Other class implementation stuff is here
//////////////////////////////////////////////
}
return ReturnType.NotImplemented
? Sul serio? Se non puoi rifiutare il tipo non implementato al momento della compilazione (puoi; usa metodi astratti) almeno getta un'eccezione.