Почему Fowler PoEAA с. 498 определяет шаблон нуля-объект следующим образом (образец укороченного, язык C#, но не имеет значения):Fowler Null Object Pattern: Зачем использовать наследование?
public class Customer
{
public virtual string Name {get; set;}
}
public class NullCustomer : Customer, INull
{
public override Name
{
get { return "ImTheNull";}
// setter ommitted
}
}
INull
используются в качестве интерфейса маркеров. мне не очень нравится этот подход по трем причинам:
- свойству должно быть отмечено виртуальными
- Я не могу запечатать мои классы сущностей больше
- По крайней мере (п + 1) новые типы введено (п нулевые объекты, один интерфейс маркера)
Почему не реализуется так:
public class Customer
{
public static readonly Customer NullCustomer = new Customer(){Name = "ImtTheNullCustomer";}
public string Name {get; set;}
}
Я, как правило, нашел, что все примеры Фаулеров хорошо продуманы, и здесь явно должно быть что-то, что я пропустил здесь.
Не делайте метод виртуальным или оставьте класс незапечатанным по этой причине. Хотя у меня огромное уважение к Мартину Фаулеру, во многих его примерах, связанных с наследованием, существует определенная явная предвзятость. По умолчанию Java-методы являются виртуальными. В C# их нет, и это дизайнерское решение было принято специально из-за воспринимаемых проблем с виртуальным по умолчанию.Во всяком случае, используйте этот шаблон, если NullCustomer будет действительным клиентом. Хорошей метрикой является сравнение ее с пустым списком. Пустой список - отличный список, и его распространение не наносит вреда. Это может быть не так. –