Если мы предположим, что нежелательно, чтобы базовый класс был чистым интерфейсным классом, и с помощью 2 примеров, приведенных ниже, что является лучшим подходом, используя определение класса абстрактного или виртуального метода?
Преимущество «абстрактной» версии состоит в том, что она, вероятно, выглядит чище и заставляет производный класс давать многообещающую осмысленную реализацию.
Преимущество «виртуальной» версии заключается в том, что она может быть легко загружена другими модулями и использована для тестирования, не добавляя связки базовых фреймворков, как того требует абстрактная версия.
Абстрактная версия:
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
? Шутки в сторону? Если вы не можете отклонить не реализованный тип во время компиляции (вы можете использовать абстрактные методы), по крайней мере, выведите исключение.