我非常喜欢这个提示:“针对接口进行编程,而不是针对实现进行编程”,并且我试图始终如一地遵循它。然而,当我必须将我的代码与必须从多个接口继承的对象分离时,我怀疑如何保持这一原则的工作。一个典型的例子可能是:
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
}
}
}
但我不确定这是否是更紧凑和更有效的解决方案:我可以拥有更复杂的多重继承层次结构,这会增加复杂性,因为我必须创建接口仅用作容器。有更好的设计方案吗?