私はいつも、インターフェイスの全体的な効果を含めながら具体的な処理を行うような方法でインターフェイスを抽象化する方法を理解するのに苦労してきました。
例えば、
interface iAudio
{
iInput input;
}
ここで、iInput はさまざまなもの (サウンドカード、ファイルなど) からの入力である可能性があります。
iAudio は、データを取得できる限り、入力がどこから来るかは気にしません。したがって、iInput は入力を抽象化します。ここまでは元気です。プラグインするiInputを実装するさまざまなものを用意できますが、この時点で何をすべきかを理解するのは難しいようです。
私は明らかに、次のようなことを行うコードを書くことができますif (input is InputFile) ...
が、それは逆効果のようです。(しかし、これは私にとって理にかなっている方法です)
私が方法を知っているが、私にとっては難しいように思われる他の方法は、iInput にデータを取得するための適切なメソッドを持たせることです。
interface iInput
{
byte[] GetData();
}
次に、InputFile や InputSoundcard など、さまざまなクラスにこれを実装させます。しかし、それはあまりにも抽象的で、何もする能力があまりありません。(データを取得できるかもしれませんが、InputFile ではファイル名を指定する必要がありますが、InputSoundcard は他のデバイス固有の情報になります。ここでは、最初のケースを引き続き使用することになります。
多分これは基本的にそれを行う正しい方法ですか?気分が悪い。私の例が問題を実証するのに十分明確であることを願っています。