public void Save()
{
if (_someObject == null)
throw new InvalidOperationException();
}
Полагаю, это очевидно. Но вы действительно не можете создать контракт, в котором тип строится иначе, если вы не измените свой тип SomeConstructor
, чтобы он работал как шаблон декоратора . Что делает шаблон декоратора, так это то, что он позволяет вам строить иерархию наследования во время выполнения, а не во время компиляции.
Затем вы можете создавать разные объекты в зависимости от того, какие операции разрешены внутри. Это некоторая работа для чего-то, что может быть легко обработано с предварительным условием для метода Save
. Но, возможно, это то, что вам нужно. И если бы вы сделали это, вы могли бы оговорить свой контракт в конструкторе SomeConstructor
.
Вот пример:
interface ISomeConstructor
{
void Save();
}
class SomeConstructor
{
ISomeConstructor impl;
public SomeConstructor(string name, object someObject)
{
impl = new StringAndObject(name, someObject);
}
public SomeConstructor(string name)
{
impl = new JustString(name);
}
public void Save()
{
impl.Save();
}
}
Типы StringAndObject
и JustString
реализуют ISomeConstructor
, и они могут обрабатывать метод Save
по своему усмотрению.
Это небольшое изменение шаблона декоратора, так как обычно вы ожидаете, что ISomeConstructor
будет также передан в качестве аргумента конструктору.