私は現在C#をマスターしようとしていますが、Gary McLean HallによるC#を介してAdaptive Codeを読んでいます。
彼はパターンとアンチパターンについて書いています。実装とインターフェースの部分で、彼は次のように書いています。
インターフェイスへのプログラミングの概念に慣れていない開発者は、多くの場合、インターフェイスの背後にあるものを手放すのが困難です。
コンパイル時に、インターフェースのクライアントは、使用しているインターフェースの実装を把握していないはずです。このような知識は、クライアントをインターフェイスの特定の実装に結び付ける誤った仮定につながる可能性があります。
クラスが永続ストレージにレコードを保存する必要がある一般的な例を想像してください。そのために、インターフェイスに正しく委任します。これにより、使用される永続的なストレージメカニズムの詳細が隠されます。ただし、実行時にどのインターフェイスの実装が使用されているかについて仮定するのは正しくありません。たとえば、インターフェイス参照を実装にキャストすることは常に悪い考えです。
それは言葉の壁か、私の経験不足かもしれませんが、それが何を意味するのかよくわかりません。ここに私が理解していることがあります:
C#を練習するための自由時間の楽しいプロジェクトがあります。そこでクラスがあります:
public class SomeClass...
このクラスは多くの場所で使用されています。C#を学習しているときに、インターフェイスで抽象化する方がよいことを読んだので、次のようにしました。
public interface ISomeClass <- Here I made a "contract" of all the public methods and properties SomeClass needs to have.
public class SomeClass : ISomeClass <- Same as before. All implementation here.
そこで、いくつかのクラス参照をすべて調べて、それらをISomeClassに置き換えました。
私が書いた建設を除いて:
ISomeClass myClass = new SomeClass();
これが間違っていることを正しく理解していますか?はいの場合、なぜそうですか、代わりに何をすべきですか?
ISomeClass myClass = new SomeClass();
か?本当にそれを意味するなら、それはおそらくあなたが望むものではなく、コンストラクターでの再帰です。 ?
ISomeClass
)が、唯一のオプションに対して有用なコードを書くことが不可能な一般的なインターフェイスを作成するのも簡単ですインターフェイスを再考してコードを書き直すか、ダウンキャストすることです。