Якщо припустити, що не бажано, щоб базовий клас був чистим інтерфейсним класом, а використовуючи два приклади знизу, що є кращим підходом, використовуючи абстрактне або віртуальне визначення класу методу?
Перевага "абстрактної" версії полягає в тому, що вона, ймовірно, виглядає більш чистою і змушує похідний клас дати сподіватися змістовної реалізації.
Перевага "віртуальної" версії полягає в тому, що її можна легко втягнути за допомогою інших модулів і використовувати для тестування, не додаючи купу базових рамок, як цього вимагає абстрактна версія.
Анотація версії:
public abstract class AbstractVersion
{
public abstract ReturnType Method1();
public abstract ReturnType Method2();
.
.
public abstract ReturnType MethodN();
//////////////////////////////////////////////
// Other class implementation stuff is here
//////////////////////////////////////////////
}
Віртуальна версія:
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? Серйозно? Якщо ви не можете відхилити незавершений тип під час компіляції (ви можете використовувати абстрактні методи), принаймні киньте виняток.