Мне очень нравится подсказка: "Программа против интерфейса, а не реализация", и я стараюсь следовать ей последовательно. Однако я сомневаюсь, как сохранить этот принцип, когда я должен отделить свой код от объектов, которые должны наследоваться от нескольких интерфейсов. Типичным примером может быть:
namespace ProgramAgainstInterfaces
{
interface IMean
{
void foo();
}
class Meaning : IMean , IDisposable
{
public void Dispose()
{
Console .WriteLine("Disposing..." );
}
public void foo()
{
Console .WriteLine("Doing something..." );
}
}
class DoingSomething
{
static void Main( string[] args)
{
IMean ThisMeaning = (IMean ) new Meaning (); // Here the issue: I am losing the IDisposable methods
ThisMeaning.foo();
ThisMeaning.Dispose(); // Error: i cannot call this method losing functionality
}
}
}
Возможным способом решения этого может быть определение ad-hoc-интерфейса, который наследует оба интерфейса:
namespace ProgramAgainstInterfaces
{
interface IMean
{
void foo();
}
interface ITry : IMean , IDisposable
{
}
class Meaning : ITry
{
public void Dispose()
{
Console .WriteLine("Disposing..." );
}
public void foo()
{
Console .WriteLine("Doing something..." );
}
}
class DoingSomething
{
static void Main( string[] args)
{
ITry ThisMeaning = (ITry ) new Meaning (); // This works
ThisMeaning.foo();
ThisMeaning.Dispose(); // The method is available
}
}
}
но я не уверен, что это более компактное и эффективное решение: у меня могут быть более сложные множественные иерархии наследования, и это добавляет сложности, потому что я должен создавать интерфейсы только для работы в качестве контейнеров. Есть лучшее дизайнерское решение?