Si suponemos que no es deseable que la clase base sea una clase de interfaz pura, y usar los 2 ejemplos a continuación, ¿cuál es un mejor enfoque, usando la definición de clase de método abstracto o virtual?
La ventaja de la versión "abstracta" es que probablemente se vea más limpia y obligue a la clase derivada a dar una implementación con esperanza significativa.
La ventaja de la versión "virtual" es que otros módulos pueden extraerla fácilmente y usarla para probar sin agregar un montón de marco subyacente como requiere la versión abstracta.
Versión abstracta:
public abstract class AbstractVersion
{
public abstract ReturnType Method1();
public abstract ReturnType Method2();
.
.
public abstract ReturnType MethodN();
//////////////////////////////////////////////
// Other class implementation stuff is here
//////////////////////////////////////////////
}
Versión virtual:
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? ¿Seriamente? Si no puede rechazar el tipo no implementado en tiempo de compilación (puede; use métodos abstractos), al menos, arroje una excepción.