如何编写接口来处理不同的概念

时间:2013-07-02 12:35:54

标签: oop interface

我一直难以理解如何以这种方式抽象接口以包含它们的整体效果,但仍处理具体细节:

如,

interface iAudio 
{
    iInput input;
}

其中iInput可以是来自各种事物(声卡,文件等)的输入。

只要可以获取数据,iAudio就不关心它的输入来自哪里。所以iInput抽象输入。到目前为止,我很好。我可以使用不同的东西实现iInput插入,但在此之后似乎很难弄清楚要做什么。

我显然可以编写类似if (input is InputFile) ...之类的代码,但这似乎适得其反。 (但这是对我有意义的方式)

另一种我知道如何,但对我来说似乎很难的方法是尝试让iInput有适当的方法来获取数据,例如,

interface iInput
{
    byte[] GetData();
}

然后让不同的类实现它,例如InputFile或InputSoundcard。虽然它看起来过于抽象,并没有提供很多能力做任何事情。 (也许我可以获取数据但是使用InputFile我需要指定文件名,而InputSoundcard则是其他设备特定信息。那么,我最后仍然会使用第一种情况。

也许这基本上是正确的方法吗?感觉不对劲。希望我的例子足够清楚,以证明这个问题。

2 个答案:

答案 0 :(得分:0)

接口iInput对我来说是正确的。我想对你所说的做出反应,这对你来说似乎是唯一真正的问题:

“也许我可以获取数据但是使用InputFile我需要指定文件名,而InputSoundcard则是其他设备特定信息”

是。但那是方法 - 特定信息,还是实例 - 特定信息?对我来说,没有参数的getData()方法是完全可以接受的,并且每个实现都将使用实例属性中可用的任何参数。

所以,是的,这是正确的方法,或者至少我是这么认为的:)

答案 1 :(得分:0)

你想要这样的界面的原因是因为音频代码不需要关心输入的类型。

不会消失,但它不属于那个阶级。

在某些时候,有一些代码可以选择一些输入,但并不是所有的都与音频代码混淆。

<强>更新

有很多方法可以设计特定的应用程序。知道如何处理它需要时间,并且不能保证学习它。还要记住,会有错误,没有办法解决它:)

检查此SOLID电子书 - http://lostechies.com/wp-content/uploads/2011/03/pablos_solid_ebook.pdf,它有帮助。