我一直难以理解如何以这种方式抽象接口以包含它们的整体效果,但仍处理具体细节:
如,
interface iAudio
{
iInput input;
}
其中iInput可以是来自各种事物(声卡,文件等)的输入。
只要可以获取数据,iAudio就不关心它的输入来自哪里。所以iInput抽象输入。到目前为止,我很好。我可以使用不同的东西实现iInput插入,但在此之后似乎很难弄清楚要做什么。我显然可以编写类似if (input is InputFile) ...
之类的代码,但这似乎适得其反。 (但这是对我有意义的方式)
另一种我知道如何,但对我来说似乎很难的方法是尝试让iInput有适当的方法来获取数据,例如,
interface iInput
{
byte[] GetData();
}
然后让不同的类实现它,例如InputFile或InputSoundcard。虽然它看起来过于抽象,并没有提供很多能力做任何事情。 (也许我可以获取数据但是使用InputFile我需要指定文件名,而InputSoundcard则是其他设备特定信息。那么,我最后仍然会使用第一种情况。
也许这基本上是正确的方法吗?感觉不对劲。希望我的例子足够清楚,以证明这个问题。
答案 0 :(得分:0)
接口iInput对我来说是正确的。我想对你所说的做出反应,这对你来说似乎是唯一真正的问题:
“也许我可以获取数据但是使用InputFile我需要指定文件名,而InputSoundcard则是其他设备特定信息”
是。但那是方法 - 特定信息,还是实例 - 特定信息?对我来说,没有参数的getData()方法是完全可以接受的,并且每个实现都将使用实例属性中可用的任何参数。
所以,是的,这是正确的方法,或者至少我是这么认为的:)
答案 1 :(得分:0)
你想要这样的界面的原因是因为音频代码不需要关心输入的类型。
不会消失,但它不属于那个阶级。
在某些时候,有一些代码可以选择一些输入,但并不是所有的都与音频代码混淆。
<强>更新强>
有很多方法可以设计特定的应用程序。知道如何处理它需要时间,并且不能保证学习它。还要记住,会有错误,没有办法解决它:)
检查此SOLID电子书 - http://lostechies.com/wp-content/uploads/2011/03/pablos_solid_ebook.pdf,它有帮助。