バーバラ・リスコフの代替原理

こんにちは、habracheloveki!



このトピックに関する秘密の知識を共有したかった。 さらに、クラスとその継承を設計するというこのかなり重要な原則に関する資料は、RuNetで何らかの形でまばらです。 次の形式の定式化があります。



「あるタイプTのオブジェクトxに関して、q(x)をtrueプロパティとします。次に、SがタイプTのサブタイプであるタイプSのオブジェクトyでもq(y)がtrueになります。」 © Wikipedia



しかし彼らは私の脳を取り出し、私をまったく喜ばせません。



このくだらないスマートフレーズの説明を聞きたい場合は、猫の下でお願いします。



だから、置換の原理はバーバラ・リスコフ。 彼は、リスコフ代替原則です。 彼はLSPです。 簡単に言えば、原則は次のとおりです。



次のクラスは、基本クラスの動作を置き換えるのではなく、補完する必要があります。



1.これは実際にはどういう意味ですか?



クラスA(仮想ではなく、実際にコードで使用)とクラスBを継承している場合、クラスAのすべての使用をBに置き換えても、プログラムは何も変更されません。 結局のところ、クラスBはクラスAの機能のみを拡張します。このチェックが機能する場合、おめでとうございます。プログラムはLiskの置換原則に準拠しています。 そうでない場合、リードプログラマーに「クラスは正しく設計されていますか?」と考える価値があります。



2.さて、なぜこれが必要なのですか?



Liskovの原理はOOP理論の分野からのものであることを皆さんがご理解いただければ幸いです。 実際には、誰も彼に銃口で従わせることを強制しません。 さらに、従うことが難しく、誰も必要としない場合があります。



つまり、有効なHTMLの場合と同じです。サイトはW3Cバリデーターのテストに合格しました-コーダーのカルマにあるプラスアダインです。 合格しなかった-合格しなかった理由を明確に理解する必要があります。これは間違いですか、他の方法で別のフリークを実装することは不可能ですか?



これから結論づけることができます:

* Lisk置換の原則に従うことで、プロジェクトをOOPの精神に近づけることができます。

*これにより、多くのエラーが回避されます(以下のエラーについて)。



3.例



私は別の自転車を発明しないことに決め、さらに、ここからの例が本当に好きでした。 私はそれを使用します(軽い変更を加えて)。



そのため、状況:サーモスタットを制御するためのプログラムを設計しています。 プログラムは、デバイスのいくつかの異なるモデルで動作できる必要があります。 プログラムは周期的に温度をチェックし、希望の温度に修正しようとします。 もちろん、プログラム自体は記述しませんが、サーモスタットのインターフェイスクラスの階層の設計について説明します。



3.1。 デビュー


最初のものは基本クラスです。 次のメソッドが必要です。

* InitializeDevice :接続されたサーモスタットの初期化。 もちろん、純粋に仮想的な方法です。デバイスが異なると、適切に機能させるために異なる前戯が必要になる場合があります。

* 参照の取得/設定 :目的の(参照)温度のゲッター/セッター。 変数を設定するための非常に特定の方法(仮想ではない)です。

* GetTemperature :デバイスから温度を読み取ります。 再び純粋に仮想的な方法。

* AdjustTemperature :純粋に仮想的なメソッドです。 実際には、温度を設定します。



これをより理解しやすい言語、つまりC ++で記述します。

  1. class TemperatureController { // int m_referenceTemperature; public : int GetReferenceTemperature() const { return m_referenceTemperature; } void SetReferenceTemperature( int referenceTemperature) { m_referenceTemperature = referenceTemperature; } virtual int GetTemperature() const = 0; virtual void AdjustTemperature( int temperature) = 0; virtual void InitializeDevice() = 0; };



  2. class TemperatureController { // int m_referenceTemperature; public : int GetReferenceTemperature() const { return m_referenceTemperature; } void SetReferenceTemperature( int referenceTemperature) { m_referenceTemperature = referenceTemperature; } virtual int GetTemperature() const = 0; virtual void AdjustTemperature( int temperature) = 0; virtual void InitializeDevice() = 0; };



  3. class TemperatureController { // int m_referenceTemperature; public : int GetReferenceTemperature() const { return m_referenceTemperature; } void SetReferenceTemperature( int referenceTemperature) { m_referenceTemperature = referenceTemperature; } virtual int GetTemperature() const = 0; virtual void AdjustTemperature( int temperature) = 0; virtual void InitializeDevice() = 0; };



  4. class TemperatureController { // int m_referenceTemperature; public : int GetReferenceTemperature() const { return m_referenceTemperature; } void SetReferenceTemperature( int referenceTemperature) { m_referenceTemperature = referenceTemperature; } virtual int GetTemperature() const = 0; virtual void AdjustTemperature( int temperature) = 0; virtual void InitializeDevice() = 0; };



  5. class TemperatureController { // int m_referenceTemperature; public : int GetReferenceTemperature() const { return m_referenceTemperature; } void SetReferenceTemperature( int referenceTemperature) { m_referenceTemperature = referenceTemperature; } virtual int GetTemperature() const = 0; virtual void AdjustTemperature( int temperature) = 0; virtual void InitializeDevice() = 0; };



  6. class TemperatureController { // int m_referenceTemperature; public : int GetReferenceTemperature() const { return m_referenceTemperature; } void SetReferenceTemperature( int referenceTemperature) { m_referenceTemperature = referenceTemperature; } virtual int GetTemperature() const = 0; virtual void AdjustTemperature( int temperature) = 0; virtual void InitializeDevice() = 0; };



  7. class TemperatureController { // int m_referenceTemperature; public : int GetReferenceTemperature() const { return m_referenceTemperature; } void SetReferenceTemperature( int referenceTemperature) { m_referenceTemperature = referenceTemperature; } virtual int GetTemperature() const = 0; virtual void AdjustTemperature( int temperature) = 0; virtual void InitializeDevice() = 0; };



  8. class TemperatureController { // int m_referenceTemperature; public : int GetReferenceTemperature() const { return m_referenceTemperature; } void SetReferenceTemperature( int referenceTemperature) { m_referenceTemperature = referenceTemperature; } virtual int GetTemperature() const = 0; virtual void AdjustTemperature( int temperature) = 0; virtual void InitializeDevice() = 0; };



  9. class TemperatureController { // int m_referenceTemperature; public : int GetReferenceTemperature() const { return m_referenceTemperature; } void SetReferenceTemperature( int referenceTemperature) { m_referenceTemperature = referenceTemperature; } virtual int GetTemperature() const = 0; virtual void AdjustTemperature( int temperature) = 0; virtual void InitializeDevice() = 0; };



  10. class TemperatureController { // int m_referenceTemperature; public : int GetReferenceTemperature() const { return m_referenceTemperature; } void SetReferenceTemperature( int referenceTemperature) { m_referenceTemperature = referenceTemperature; } virtual int GetTemperature() const = 0; virtual void AdjustTemperature( int temperature) = 0; virtual void InitializeDevice() = 0; };



  11. class TemperatureController { // int m_referenceTemperature; public : int GetReferenceTemperature() const { return m_referenceTemperature; } void SetReferenceTemperature( int referenceTemperature) { m_referenceTemperature = referenceTemperature; } virtual int GetTemperature() const = 0; virtual void AdjustTemperature( int temperature) = 0; virtual void InitializeDevice() = 0; };



  12. class TemperatureController { // int m_referenceTemperature; public : int GetReferenceTemperature() const { return m_referenceTemperature; } void SetReferenceTemperature( int referenceTemperature) { m_referenceTemperature = referenceTemperature; } virtual int GetTemperature() const = 0; virtual void AdjustTemperature( int temperature) = 0; virtual void InitializeDevice() = 0; };



  13. class TemperatureController { // int m_referenceTemperature; public : int GetReferenceTemperature() const { return m_referenceTemperature; } void SetReferenceTemperature( int referenceTemperature) { m_referenceTemperature = referenceTemperature; } virtual int GetTemperature() const = 0; virtual void AdjustTemperature( int temperature) = 0; virtual void InitializeDevice() = 0; };



  14. class TemperatureController { // int m_referenceTemperature; public : int GetReferenceTemperature() const { return m_referenceTemperature; } void SetReferenceTemperature( int referenceTemperature) { m_referenceTemperature = referenceTemperature; } virtual int GetTemperature() const = 0; virtual void AdjustTemperature( int temperature) = 0; virtual void InitializeDevice() = 0; };



  15. class TemperatureController { // int m_referenceTemperature; public : int GetReferenceTemperature() const { return m_referenceTemperature; } void SetReferenceTemperature( int referenceTemperature) { m_referenceTemperature = referenceTemperature; } virtual int GetTemperature() const = 0; virtual void AdjustTemperature( int temperature) = 0; virtual void InitializeDevice() = 0; };



  16. class TemperatureController { // int m_referenceTemperature; public : int GetReferenceTemperature() const { return m_referenceTemperature; } void SetReferenceTemperature( int referenceTemperature) { m_referenceTemperature = referenceTemperature; } virtual int GetTemperature() const = 0; virtual void AdjustTemperature( int temperature) = 0; virtual void InitializeDevice() = 0; };



  17. class TemperatureController { // int m_referenceTemperature; public : int GetReferenceTemperature() const { return m_referenceTemperature; } void SetReferenceTemperature( int referenceTemperature) { m_referenceTemperature = referenceTemperature; } virtual int GetTemperature() const = 0; virtual void AdjustTemperature( int temperature) = 0; virtual void InitializeDevice() = 0; };







3.2。 ミドルゲーム


そして今、私たちは有名で人気のあるBrand_AとBrand_Bの「本物の」サーモスタットを操作するための2つの特定のクラスを描画します(どうやって?知らないの?私も):

  1. class Brand_A_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(TEMP_REGISTER)); } void AdjustTemperature( int temperature) { io_write(TEMP_CHANGE_REGISTER, temperature); } void InitializeDevice() { // } }; class Brand_B_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(STATUS_REGISTER) & TEMP_MASK); } void AdjustTemperature( int temperature) { // : // ! , . io_write(CHANGE_REGISTER, temperature + 273); } void InitializeDevice() { // } };



  2. class Brand_A_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(TEMP_REGISTER)); } void AdjustTemperature( int temperature) { io_write(TEMP_CHANGE_REGISTER, temperature); } void InitializeDevice() { // } }; class Brand_B_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(STATUS_REGISTER) & TEMP_MASK); } void AdjustTemperature( int temperature) { // : // ! , . io_write(CHANGE_REGISTER, temperature + 273); } void InitializeDevice() { // } };



  3. class Brand_A_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(TEMP_REGISTER)); } void AdjustTemperature( int temperature) { io_write(TEMP_CHANGE_REGISTER, temperature); } void InitializeDevice() { // } }; class Brand_B_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(STATUS_REGISTER) & TEMP_MASK); } void AdjustTemperature( int temperature) { // : // ! , . io_write(CHANGE_REGISTER, temperature + 273); } void InitializeDevice() { // } };



  4. class Brand_A_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(TEMP_REGISTER)); } void AdjustTemperature( int temperature) { io_write(TEMP_CHANGE_REGISTER, temperature); } void InitializeDevice() { // } }; class Brand_B_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(STATUS_REGISTER) & TEMP_MASK); } void AdjustTemperature( int temperature) { // : // ! , . io_write(CHANGE_REGISTER, temperature + 273); } void InitializeDevice() { // } };



  5. class Brand_A_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(TEMP_REGISTER)); } void AdjustTemperature( int temperature) { io_write(TEMP_CHANGE_REGISTER, temperature); } void InitializeDevice() { // } }; class Brand_B_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(STATUS_REGISTER) & TEMP_MASK); } void AdjustTemperature( int temperature) { // : // ! , . io_write(CHANGE_REGISTER, temperature + 273); } void InitializeDevice() { // } };



  6. class Brand_A_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(TEMP_REGISTER)); } void AdjustTemperature( int temperature) { io_write(TEMP_CHANGE_REGISTER, temperature); } void InitializeDevice() { // } }; class Brand_B_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(STATUS_REGISTER) & TEMP_MASK); } void AdjustTemperature( int temperature) { // : // ! , . io_write(CHANGE_REGISTER, temperature + 273); } void InitializeDevice() { // } };



  7. class Brand_A_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(TEMP_REGISTER)); } void AdjustTemperature( int temperature) { io_write(TEMP_CHANGE_REGISTER, temperature); } void InitializeDevice() { // } }; class Brand_B_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(STATUS_REGISTER) & TEMP_MASK); } void AdjustTemperature( int temperature) { // : // ! , . io_write(CHANGE_REGISTER, temperature + 273); } void InitializeDevice() { // } };



  8. class Brand_A_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(TEMP_REGISTER)); } void AdjustTemperature( int temperature) { io_write(TEMP_CHANGE_REGISTER, temperature); } void InitializeDevice() { // } }; class Brand_B_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(STATUS_REGISTER) & TEMP_MASK); } void AdjustTemperature( int temperature) { // : // ! , . io_write(CHANGE_REGISTER, temperature + 273); } void InitializeDevice() { // } };



  9. class Brand_A_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(TEMP_REGISTER)); } void AdjustTemperature( int temperature) { io_write(TEMP_CHANGE_REGISTER, temperature); } void InitializeDevice() { // } }; class Brand_B_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(STATUS_REGISTER) & TEMP_MASK); } void AdjustTemperature( int temperature) { // : // ! , . io_write(CHANGE_REGISTER, temperature + 273); } void InitializeDevice() { // } };



  10. class Brand_A_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(TEMP_REGISTER)); } void AdjustTemperature( int temperature) { io_write(TEMP_CHANGE_REGISTER, temperature); } void InitializeDevice() { // } }; class Brand_B_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(STATUS_REGISTER) & TEMP_MASK); } void AdjustTemperature( int temperature) { // : // ! , . io_write(CHANGE_REGISTER, temperature + 273); } void InitializeDevice() { // } };



  11. class Brand_A_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(TEMP_REGISTER)); } void AdjustTemperature( int temperature) { io_write(TEMP_CHANGE_REGISTER, temperature); } void InitializeDevice() { // } }; class Brand_B_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(STATUS_REGISTER) & TEMP_MASK); } void AdjustTemperature( int temperature) { // : // ! , . io_write(CHANGE_REGISTER, temperature + 273); } void InitializeDevice() { // } };



  12. class Brand_A_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(TEMP_REGISTER)); } void AdjustTemperature( int temperature) { io_write(TEMP_CHANGE_REGISTER, temperature); } void InitializeDevice() { // } }; class Brand_B_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(STATUS_REGISTER) & TEMP_MASK); } void AdjustTemperature( int temperature) { // : // ! , . io_write(CHANGE_REGISTER, temperature + 273); } void InitializeDevice() { // } };



  13. class Brand_A_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(TEMP_REGISTER)); } void AdjustTemperature( int temperature) { io_write(TEMP_CHANGE_REGISTER, temperature); } void InitializeDevice() { // } }; class Brand_B_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(STATUS_REGISTER) & TEMP_MASK); } void AdjustTemperature( int temperature) { // : // ! , . io_write(CHANGE_REGISTER, temperature + 273); } void InitializeDevice() { // } };



  14. class Brand_A_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(TEMP_REGISTER)); } void AdjustTemperature( int temperature) { io_write(TEMP_CHANGE_REGISTER, temperature); } void InitializeDevice() { // } }; class Brand_B_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(STATUS_REGISTER) & TEMP_MASK); } void AdjustTemperature( int temperature) { // : // ! , . io_write(CHANGE_REGISTER, temperature + 273); } void InitializeDevice() { // } };



  15. class Brand_A_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(TEMP_REGISTER)); } void AdjustTemperature( int temperature) { io_write(TEMP_CHANGE_REGISTER, temperature); } void InitializeDevice() { // } }; class Brand_B_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(STATUS_REGISTER) & TEMP_MASK); } void AdjustTemperature( int temperature) { // : // ! , . io_write(CHANGE_REGISTER, temperature + 273); } void InitializeDevice() { // } };



  16. class Brand_A_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(TEMP_REGISTER)); } void AdjustTemperature( int temperature) { io_write(TEMP_CHANGE_REGISTER, temperature); } void InitializeDevice() { // } }; class Brand_B_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(STATUS_REGISTER) & TEMP_MASK); } void AdjustTemperature( int temperature) { // : // ! , . io_write(CHANGE_REGISTER, temperature + 273); } void InitializeDevice() { // } };



  17. class Brand_A_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(TEMP_REGISTER)); } void AdjustTemperature( int temperature) { io_write(TEMP_CHANGE_REGISTER, temperature); } void InitializeDevice() { // } }; class Brand_B_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(STATUS_REGISTER) & TEMP_MASK); } void AdjustTemperature( int temperature) { // : // ! , . io_write(CHANGE_REGISTER, temperature + 273); } void InitializeDevice() { // } };



  18. class Brand_A_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(TEMP_REGISTER)); } void AdjustTemperature( int temperature) { io_write(TEMP_CHANGE_REGISTER, temperature); } void InitializeDevice() { // } }; class Brand_B_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(STATUS_REGISTER) & TEMP_MASK); } void AdjustTemperature( int temperature) { // : // ! , . io_write(CHANGE_REGISTER, temperature + 273); } void InitializeDevice() { // } };



  19. class Brand_A_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(TEMP_REGISTER)); } void AdjustTemperature( int temperature) { io_write(TEMP_CHANGE_REGISTER, temperature); } void InitializeDevice() { // } }; class Brand_B_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(STATUS_REGISTER) & TEMP_MASK); } void AdjustTemperature( int temperature) { // : // ! , . io_write(CHANGE_REGISTER, temperature + 273); } void InitializeDevice() { // } };



  20. class Brand_A_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(TEMP_REGISTER)); } void AdjustTemperature( int temperature) { io_write(TEMP_CHANGE_REGISTER, temperature); } void InitializeDevice() { // } }; class Brand_B_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(STATUS_REGISTER) & TEMP_MASK); } void AdjustTemperature( int temperature) { // : // ! , . io_write(CHANGE_REGISTER, temperature + 273); } void InitializeDevice() { // } };



  21. class Brand_A_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(TEMP_REGISTER)); } void AdjustTemperature( int temperature) { io_write(TEMP_CHANGE_REGISTER, temperature); } void InitializeDevice() { // } }; class Brand_B_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(STATUS_REGISTER) & TEMP_MASK); } void AdjustTemperature( int temperature) { // : // ! , . io_write(CHANGE_REGISTER, temperature + 273); } void InitializeDevice() { // } };



  22. class Brand_A_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(TEMP_REGISTER)); } void AdjustTemperature( int temperature) { io_write(TEMP_CHANGE_REGISTER, temperature); } void InitializeDevice() { // } }; class Brand_B_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(STATUS_REGISTER) & TEMP_MASK); } void AdjustTemperature( int temperature) { // : // ! , . io_write(CHANGE_REGISTER, temperature + 273); } void InitializeDevice() { // } };



  23. class Brand_A_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(TEMP_REGISTER)); } void AdjustTemperature( int temperature) { io_write(TEMP_CHANGE_REGISTER, temperature); } void InitializeDevice() { // } }; class Brand_B_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(STATUS_REGISTER) & TEMP_MASK); } void AdjustTemperature( int temperature) { // : // ! , . io_write(CHANGE_REGISTER, temperature + 273); } void InitializeDevice() { // } };



  24. class Brand_A_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(TEMP_REGISTER)); } void AdjustTemperature( int temperature) { io_write(TEMP_CHANGE_REGISTER, temperature); } void InitializeDevice() { // } }; class Brand_B_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(STATUS_REGISTER) & TEMP_MASK); } void AdjustTemperature( int temperature) { // : // ! , . io_write(CHANGE_REGISTER, temperature + 273); } void InitializeDevice() { // } };



  25. class Brand_A_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(TEMP_REGISTER)); } void AdjustTemperature( int temperature) { io_write(TEMP_CHANGE_REGISTER, temperature); } void InitializeDevice() { // } }; class Brand_B_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(STATUS_REGISTER) & TEMP_MASK); } void AdjustTemperature( int temperature) { // : // ! , . io_write(CHANGE_REGISTER, temperature + 273); } void InitializeDevice() { // } };



  26. class Brand_A_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(TEMP_REGISTER)); } void AdjustTemperature( int temperature) { io_write(TEMP_CHANGE_REGISTER, temperature); } void InitializeDevice() { // } }; class Brand_B_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(STATUS_REGISTER) & TEMP_MASK); } void AdjustTemperature( int temperature) { // : // ! , . io_write(CHANGE_REGISTER, temperature + 273); } void InitializeDevice() { // } };



  27. class Brand_A_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(TEMP_REGISTER)); } void AdjustTemperature( int temperature) { io_write(TEMP_CHANGE_REGISTER, temperature); } void InitializeDevice() { // } }; class Brand_B_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(STATUS_REGISTER) & TEMP_MASK); } void AdjustTemperature( int temperature) { // : // ! , . io_write(CHANGE_REGISTER, temperature + 273); } void InitializeDevice() { // } };



  28. class Brand_A_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(TEMP_REGISTER)); } void AdjustTemperature( int temperature) { io_write(TEMP_CHANGE_REGISTER, temperature); } void InitializeDevice() { // } }; class Brand_B_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(STATUS_REGISTER) & TEMP_MASK); } void AdjustTemperature( int temperature) { // : // ! , . io_write(CHANGE_REGISTER, temperature + 273); } void InitializeDevice() { // } };



  29. class Brand_A_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(TEMP_REGISTER)); } void AdjustTemperature( int temperature) { io_write(TEMP_CHANGE_REGISTER, temperature); } void InitializeDevice() { // } }; class Brand_B_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(STATUS_REGISTER) & TEMP_MASK); } void AdjustTemperature( int temperature) { // : // ! , . io_write(CHANGE_REGISTER, temperature + 273); } void InitializeDevice() { // } };



  30. class Brand_A_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(TEMP_REGISTER)); } void AdjustTemperature( int temperature) { io_write(TEMP_CHANGE_REGISTER, temperature); } void InitializeDevice() { // } }; class Brand_B_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(STATUS_REGISTER) & TEMP_MASK); } void AdjustTemperature( int temperature) { // : // ! , . io_write(CHANGE_REGISTER, temperature + 273); } void InitializeDevice() { // } };



  31. class Brand_A_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(TEMP_REGISTER)); } void AdjustTemperature( int temperature) { io_write(TEMP_CHANGE_REGISTER, temperature); } void InitializeDevice() { // } }; class Brand_B_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(STATUS_REGISTER) & TEMP_MASK); } void AdjustTemperature( int temperature) { // : // ! , . io_write(CHANGE_REGISTER, temperature + 273); } void InitializeDevice() { // } };



  32. class Brand_A_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(TEMP_REGISTER)); } void AdjustTemperature( int temperature) { io_write(TEMP_CHANGE_REGISTER, temperature); } void InitializeDevice() { // } }; class Brand_B_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(STATUS_REGISTER) & TEMP_MASK); } void AdjustTemperature( int temperature) { // : // ! , . io_write(CHANGE_REGISTER, temperature + 273); } void InitializeDevice() { // } };



  33. class Brand_A_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(TEMP_REGISTER)); } void AdjustTemperature( int temperature) { io_write(TEMP_CHANGE_REGISTER, temperature); } void InitializeDevice() { // } }; class Brand_B_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(STATUS_REGISTER) & TEMP_MASK); } void AdjustTemperature( int temperature) { // : // ! , . io_write(CHANGE_REGISTER, temperature + 273); } void InitializeDevice() { // } };



  34. class Brand_A_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(TEMP_REGISTER)); } void AdjustTemperature( int temperature) { io_write(TEMP_CHANGE_REGISTER, temperature); } void InitializeDevice() { // } }; class Brand_B_TemperatureController : public TemperatureController { public : int GetTemperature() const { return (io_read(STATUS_REGISTER) & TEMP_MASK); } void AdjustTemperature( int temperature) { // : // ! , . io_write(CHANGE_REGISTER, temperature + 273); } void InitializeDevice() { // } };





出来上がり! 私たちのプログラムにいくつかの行を書くことは残っています:

  1. . . . TemperatureController *pTempCtrl = GetNextTempController(); pTempCtrl->SetReferenceTemperature(10); pTempCtrl->InitializeDevice(); . . .



  2. . . . TemperatureController *pTempCtrl = GetNextTempController(); pTempCtrl->SetReferenceTemperature(10); pTempCtrl->InitializeDevice(); . . .



  3. . . . TemperatureController *pTempCtrl = GetNextTempController(); pTempCtrl->SetReferenceTemperature(10); pTempCtrl->InitializeDevice(); . . .



  4. . . . TemperatureController *pTempCtrl = GetNextTempController(); pTempCtrl->SetReferenceTemperature(10); pTempCtrl->InitializeDevice(); . . .



  5. . . . TemperatureController *pTempCtrl = GetNextTempController(); pTempCtrl->SetReferenceTemperature(10); pTempCtrl->InitializeDevice(); . . .





そして、すべてがクールです! プログラムは機能し、顧客は満足しています。Habrを読みます。



3.3。 終盤


少し時間がかかり、マーケティング担当者(パンを何も食べない!)が、大きなタッチスクリーンとFMチューナーを備えた新しいスタイリッシュなサーモスタットに登場しました。 新しいデバイスを取得したお客様は、再び発表され、しきい値から発表します:「プログラムが私の美しさをサポートしていることを望みます!」



OK、別のデバイスを追加しましょう。 Brand_C_TemperatureControllerを書くのは難しくありませんか? 改訂の過程で、タッチスクリーンに加えて新しいサーモスタットが高度な自動化機能を備えていることが突然判明しました。 手動でチェックして温度を調整する必要はありません。 必要な温度を1回供給するだけで十分です(このReferenceTemperatureがあります)。残りは自分で行います。 これは良い(面倒が少ない)と悪い(私たちのクラスはそのような状況に特に適応していない)。



5分で出口が見つかります:基本クラスvirtualでGet / Set Referenceを宣言し、新しいBrand_Cサーモスタットのクラスで、これらのメソッドを再定義して、サーモスタットの温度を直接読み書きします。 美人ですか? すぐに言ってやった:



  1. class TemperatureController { // int m_referenceTemperature; public : // / // virtual int GetReferenceTemperature() const { return m_referenceTemperature; } virtual void SetReferenceTemperature( int referenceTemperature) { m_referenceTemperature = referenceTemperature; } virtual int GetTemperature() const = 0; virtual void AdjustTemperature( int temperature) = 0; virtual void InitializeDevice() = 0; }; class Brand_C_TemperatureController : public TemperatureController { public : // / int GetReferenceTemperature() const { return (io_read(REFERENCE_REGISTER); } void SetReferenceTemperature( int referenceTemperature) { io_write(REFERENCE_REGISTER, referenceTemperature); } int GetTemperature() const { return (io_read(TEMP_MONITORING_REGISTER)); } void AdjustTemperature( int temperature) { // : } void InitializeDevice() { // , } };



  2. class TemperatureController { // int m_referenceTemperature; public : // / // virtual int GetReferenceTemperature() const { return m_referenceTemperature; } virtual void SetReferenceTemperature( int referenceTemperature) { m_referenceTemperature = referenceTemperature; } virtual int GetTemperature() const = 0; virtual void AdjustTemperature( int temperature) = 0; virtual void InitializeDevice() = 0; }; class Brand_C_TemperatureController : public TemperatureController { public : // / int GetReferenceTemperature() const { return (io_read(REFERENCE_REGISTER); } void SetReferenceTemperature( int referenceTemperature) { io_write(REFERENCE_REGISTER, referenceTemperature); } int GetTemperature() const { return (io_read(TEMP_MONITORING_REGISTER)); } void AdjustTemperature( int temperature) { // : } void InitializeDevice() { // , } };



  3. class TemperatureController { // int m_referenceTemperature; public : // / // virtual int GetReferenceTemperature() const { return m_referenceTemperature; } virtual void SetReferenceTemperature( int referenceTemperature) { m_referenceTemperature = referenceTemperature; } virtual int GetTemperature() const = 0; virtual void AdjustTemperature( int temperature) = 0; virtual void InitializeDevice() = 0; }; class Brand_C_TemperatureController : public TemperatureController { public : // / int GetReferenceTemperature() const { return (io_read(REFERENCE_REGISTER); } void SetReferenceTemperature( int referenceTemperature) { io_write(REFERENCE_REGISTER, referenceTemperature); } int GetTemperature() const { return (io_read(TEMP_MONITORING_REGISTER)); } void AdjustTemperature( int temperature) { // : } void InitializeDevice() { // , } };



  4. class TemperatureController { // int m_referenceTemperature; public : // / // virtual int GetReferenceTemperature() const { return m_referenceTemperature; } virtual void SetReferenceTemperature( int referenceTemperature) { m_referenceTemperature = referenceTemperature; } virtual int GetTemperature() const = 0; virtual void AdjustTemperature( int temperature) = 0; virtual void InitializeDevice() = 0; }; class Brand_C_TemperatureController : public TemperatureController { public : // / int GetReferenceTemperature() const { return (io_read(REFERENCE_REGISTER); } void SetReferenceTemperature( int referenceTemperature) { io_write(REFERENCE_REGISTER, referenceTemperature); } int GetTemperature() const { return (io_read(TEMP_MONITORING_REGISTER)); } void AdjustTemperature( int temperature) { // : } void InitializeDevice() { // , } };



  5. class TemperatureController { // int m_referenceTemperature; public : // / // virtual int GetReferenceTemperature() const { return m_referenceTemperature; } virtual void SetReferenceTemperature( int referenceTemperature) { m_referenceTemperature = referenceTemperature; } virtual int GetTemperature() const = 0; virtual void AdjustTemperature( int temperature) = 0; virtual void InitializeDevice() = 0; }; class Brand_C_TemperatureController : public TemperatureController { public : // / int GetReferenceTemperature() const { return (io_read(REFERENCE_REGISTER); } void SetReferenceTemperature( int referenceTemperature) { io_write(REFERENCE_REGISTER, referenceTemperature); } int GetTemperature() const { return (io_read(TEMP_MONITORING_REGISTER)); } void AdjustTemperature( int temperature) { // : } void InitializeDevice() { // , } };



  6. class TemperatureController { // int m_referenceTemperature; public : // / // virtual int GetReferenceTemperature() const { return m_referenceTemperature; } virtual void SetReferenceTemperature( int referenceTemperature) { m_referenceTemperature = referenceTemperature; } virtual int GetTemperature() const = 0; virtual void AdjustTemperature( int temperature) = 0; virtual void InitializeDevice() = 0; }; class Brand_C_TemperatureController : public TemperatureController { public : // / int GetReferenceTemperature() const { return (io_read(REFERENCE_REGISTER); } void SetReferenceTemperature( int referenceTemperature) { io_write(REFERENCE_REGISTER, referenceTemperature); } int GetTemperature() const { return (io_read(TEMP_MONITORING_REGISTER)); } void AdjustTemperature( int temperature) { // : } void InitializeDevice() { // , } };



  7. class TemperatureController { // int m_referenceTemperature; public : // / // virtual int GetReferenceTemperature() const { return m_referenceTemperature; } virtual void SetReferenceTemperature( int referenceTemperature) { m_referenceTemperature = referenceTemperature; } virtual int GetTemperature() const = 0; virtual void AdjustTemperature( int temperature) = 0; virtual void InitializeDevice() = 0; }; class Brand_C_TemperatureController : public TemperatureController { public : // / int GetReferenceTemperature() const { return (io_read(REFERENCE_REGISTER); } void SetReferenceTemperature( int referenceTemperature) { io_write(REFERENCE_REGISTER, referenceTemperature); } int GetTemperature() const { return (io_read(TEMP_MONITORING_REGISTER)); } void AdjustTemperature( int temperature) { // : } void InitializeDevice() { // , } };



  8. class TemperatureController { // int m_referenceTemperature; public : // / // virtual int GetReferenceTemperature() const { return m_referenceTemperature; } virtual void SetReferenceTemperature( int referenceTemperature) { m_referenceTemperature = referenceTemperature; } virtual int GetTemperature() const = 0; virtual void AdjustTemperature( int temperature) = 0; virtual void InitializeDevice() = 0; }; class Brand_C_TemperatureController : public TemperatureController { public : // / int GetReferenceTemperature() const { return (io_read(REFERENCE_REGISTER); } void SetReferenceTemperature( int referenceTemperature) { io_write(REFERENCE_REGISTER, referenceTemperature); } int GetTemperature() const { return (io_read(TEMP_MONITORING_REGISTER)); } void AdjustTemperature( int temperature) { // : } void InitializeDevice() { // , } };



  9. class TemperatureController { // int m_referenceTemperature; public : // / // virtual int GetReferenceTemperature() const { return m_referenceTemperature; } virtual void SetReferenceTemperature( int referenceTemperature) { m_referenceTemperature = referenceTemperature; } virtual int GetTemperature() const = 0; virtual void AdjustTemperature( int temperature) = 0; virtual void InitializeDevice() = 0; }; class Brand_C_TemperatureController : public TemperatureController { public : // / int GetReferenceTemperature() const { return (io_read(REFERENCE_REGISTER); } void SetReferenceTemperature( int referenceTemperature) { io_write(REFERENCE_REGISTER, referenceTemperature); } int GetTemperature() const { return (io_read(TEMP_MONITORING_REGISTER)); } void AdjustTemperature( int temperature) { // : } void InitializeDevice() { // , } };



  10. class TemperatureController { // int m_referenceTemperature; public : // / // virtual int GetReferenceTemperature() const { return m_referenceTemperature; } virtual void SetReferenceTemperature( int referenceTemperature) { m_referenceTemperature = referenceTemperature; } virtual int GetTemperature() const = 0; virtual void AdjustTemperature( int temperature) = 0; virtual void InitializeDevice() = 0; }; class Brand_C_TemperatureController : public TemperatureController { public : // / int GetReferenceTemperature() const { return (io_read(REFERENCE_REGISTER); } void SetReferenceTemperature( int referenceTemperature) { io_write(REFERENCE_REGISTER, referenceTemperature); } int GetTemperature() const { return (io_read(TEMP_MONITORING_REGISTER)); } void AdjustTemperature( int temperature) { // : } void InitializeDevice() { // , } };



  11. class TemperatureController { // int m_referenceTemperature; public : // / // virtual int GetReferenceTemperature() const { return m_referenceTemperature; } virtual void SetReferenceTemperature( int referenceTemperature) { m_referenceTemperature = referenceTemperature; } virtual int GetTemperature() const = 0; virtual void AdjustTemperature( int temperature) = 0; virtual void InitializeDevice() = 0; }; class Brand_C_TemperatureController : public TemperatureController { public : // / int GetReferenceTemperature() const { return (io_read(REFERENCE_REGISTER); } void SetReferenceTemperature( int referenceTemperature) { io_write(REFERENCE_REGISTER, referenceTemperature); } int GetTemperature() const { return (io_read(TEMP_MONITORING_REGISTER)); } void AdjustTemperature( int temperature) { // : } void InitializeDevice() { // , } };



  12. class TemperatureController { // int m_referenceTemperature; public : // / // virtual int GetReferenceTemperature() const { return m_referenceTemperature; } virtual void SetReferenceTemperature( int referenceTemperature) { m_referenceTemperature = referenceTemperature; } virtual int GetTemperature() const = 0; virtual void AdjustTemperature( int temperature) = 0; virtual void InitializeDevice() = 0; }; class Brand_C_TemperatureController : public TemperatureController { public : // / int GetReferenceTemperature() const { return (io_read(REFERENCE_REGISTER); } void SetReferenceTemperature( int referenceTemperature) { io_write(REFERENCE_REGISTER, referenceTemperature); } int GetTemperature() const { return (io_read(TEMP_MONITORING_REGISTER)); } void AdjustTemperature( int temperature) { // : } void InitializeDevice() { // , } };



  13. class TemperatureController { // int m_referenceTemperature; public : // / // virtual int GetReferenceTemperature() const { return m_referenceTemperature; } virtual void SetReferenceTemperature( int referenceTemperature) { m_referenceTemperature = referenceTemperature; } virtual int GetTemperature() const = 0; virtual void AdjustTemperature( int temperature) = 0; virtual void InitializeDevice() = 0; }; class Brand_C_TemperatureController : public TemperatureController { public : // / int GetReferenceTemperature() const { return (io_read(REFERENCE_REGISTER); } void SetReferenceTemperature( int referenceTemperature) { io_write(REFERENCE_REGISTER, referenceTemperature); } int GetTemperature() const { return (io_read(TEMP_MONITORING_REGISTER)); } void AdjustTemperature( int temperature) { // : } void InitializeDevice() { // , } };



  14. class TemperatureController { // int m_referenceTemperature; public : // / // virtual int GetReferenceTemperature() const { return m_referenceTemperature; } virtual void SetReferenceTemperature( int referenceTemperature) { m_referenceTemperature = referenceTemperature; } virtual int GetTemperature() const = 0; virtual void AdjustTemperature( int temperature) = 0; virtual void InitializeDevice() = 0; }; class Brand_C_TemperatureController : public TemperatureController { public : // / int GetReferenceTemperature() const { return (io_read(REFERENCE_REGISTER); } void SetReferenceTemperature( int referenceTemperature) { io_write(REFERENCE_REGISTER, referenceTemperature); } int GetTemperature() const { return (io_read(TEMP_MONITORING_REGISTER)); } void AdjustTemperature( int temperature) { // : } void InitializeDevice() { // , } };



  15. class TemperatureController { // int m_referenceTemperature; public : // / // virtual int GetReferenceTemperature() const { return m_referenceTemperature; } virtual void SetReferenceTemperature( int referenceTemperature) { m_referenceTemperature = referenceTemperature; } virtual int GetTemperature() const = 0; virtual void AdjustTemperature( int temperature) = 0; virtual void InitializeDevice() = 0; }; class Brand_C_TemperatureController : public TemperatureController { public : // / int GetReferenceTemperature() const { return (io_read(REFERENCE_REGISTER); } void SetReferenceTemperature( int referenceTemperature) { io_write(REFERENCE_REGISTER, referenceTemperature); } int GetTemperature() const { return (io_read(TEMP_MONITORING_REGISTER)); } void AdjustTemperature( int temperature) { // : } void InitializeDevice() { // , } };



  16. class TemperatureController { // int m_referenceTemperature; public : // / // virtual int GetReferenceTemperature() const { return m_referenceTemperature; } virtual void SetReferenceTemperature( int referenceTemperature) { m_referenceTemperature = referenceTemperature; } virtual int GetTemperature() const = 0; virtual void AdjustTemperature( int temperature) = 0; virtual void InitializeDevice() = 0; }; class Brand_C_TemperatureController : public TemperatureController { public : // / int GetReferenceTemperature() const { return (io_read(REFERENCE_REGISTER); } void SetReferenceTemperature( int referenceTemperature) { io_write(REFERENCE_REGISTER, referenceTemperature); } int GetTemperature() const { return (io_read(TEMP_MONITORING_REGISTER)); } void AdjustTemperature( int temperature) { // : } void InitializeDevice() { // , } };



  17. class TemperatureController { // int m_referenceTemperature; public : // / // virtual int GetReferenceTemperature() const { return m_referenceTemperature; } virtual void SetReferenceTemperature( int referenceTemperature) { m_referenceTemperature = referenceTemperature; } virtual int GetTemperature() const = 0; virtual void AdjustTemperature( int temperature) = 0; virtual void InitializeDevice() = 0; }; class Brand_C_TemperatureController : public TemperatureController { public : // / int GetReferenceTemperature() const { return (io_read(REFERENCE_REGISTER); } void SetReferenceTemperature( int referenceTemperature) { io_write(REFERENCE_REGISTER, referenceTemperature); } int GetTemperature() const { return (io_read(TEMP_MONITORING_REGISTER)); } void AdjustTemperature( int temperature) { // : } void InitializeDevice() { // , } };



  18. class TemperatureController { // int m_referenceTemperature; public : // / // virtual int GetReferenceTemperature() const { return m_referenceTemperature; } virtual void SetReferenceTemperature( int referenceTemperature) { m_referenceTemperature = referenceTemperature; } virtual int GetTemperature() const = 0; virtual void AdjustTemperature( int temperature) = 0; virtual void InitializeDevice() = 0; }; class Brand_C_TemperatureController : public TemperatureController { public : // / int GetReferenceTemperature() const { return (io_read(REFERENCE_REGISTER); } void SetReferenceTemperature( int referenceTemperature) { io_write(REFERENCE_REGISTER, referenceTemperature); } int GetTemperature() const { return (io_read(TEMP_MONITORING_REGISTER)); } void AdjustTemperature( int temperature) { // : } void InitializeDevice() { // , } };



  19. class TemperatureController { // int m_referenceTemperature; public : // / // virtual int GetReferenceTemperature() const { return m_referenceTemperature; } virtual void SetReferenceTemperature( int referenceTemperature) { m_referenceTemperature = referenceTemperature; } virtual int GetTemperature() const = 0; virtual void AdjustTemperature( int temperature) = 0; virtual void InitializeDevice() = 0; }; class Brand_C_TemperatureController : public TemperatureController { public : // / int GetReferenceTemperature() const { return (io_read(REFERENCE_REGISTER); } void SetReferenceTemperature( int referenceTemperature) { io_write(REFERENCE_REGISTER, referenceTemperature); } int GetTemperature() const { return (io_read(TEMP_MONITORING_REGISTER)); } void AdjustTemperature( int temperature) { // : } void InitializeDevice() { // , } };



  20. class TemperatureController { // int m_referenceTemperature; public : // / // virtual int GetReferenceTemperature() const { return m_referenceTemperature; } virtual void SetReferenceTemperature( int referenceTemperature) { m_referenceTemperature = referenceTemperature; } virtual int GetTemperature() const = 0; virtual void AdjustTemperature( int temperature) = 0; virtual void InitializeDevice() = 0; }; class Brand_C_TemperatureController : public TemperatureController { public : // / int GetReferenceTemperature() const { return (io_read(REFERENCE_REGISTER); } void SetReferenceTemperature( int referenceTemperature) { io_write(REFERENCE_REGISTER, referenceTemperature); } int GetTemperature() const { return (io_read(TEMP_MONITORING_REGISTER)); } void AdjustTemperature( int temperature) { // : } void InitializeDevice() { // , } };



  21. class TemperatureController { // int m_referenceTemperature; public : // / // virtual int GetReferenceTemperature() const { return m_referenceTemperature; } virtual void SetReferenceTemperature( int referenceTemperature) { m_referenceTemperature = referenceTemperature; } virtual int GetTemperature() const = 0; virtual void AdjustTemperature( int temperature) = 0; virtual void InitializeDevice() = 0; }; class Brand_C_TemperatureController : public TemperatureController { public : // / int GetReferenceTemperature() const { return (io_read(REFERENCE_REGISTER); } void SetReferenceTemperature( int referenceTemperature) { io_write(REFERENCE_REGISTER, referenceTemperature); } int GetTemperature() const { return (io_read(TEMP_MONITORING_REGISTER)); } void AdjustTemperature( int temperature) { // : } void InitializeDevice() { // , } };



  22. class TemperatureController { // int m_referenceTemperature; public : // / // virtual int GetReferenceTemperature() const { return m_referenceTemperature; } virtual void SetReferenceTemperature( int referenceTemperature) { m_referenceTemperature = referenceTemperature; } virtual int GetTemperature() const = 0; virtual void AdjustTemperature( int temperature) = 0; virtual void InitializeDevice() = 0; }; class Brand_C_TemperatureController : public TemperatureController { public : // / int GetReferenceTemperature() const { return (io_read(REFERENCE_REGISTER); } void SetReferenceTemperature( int referenceTemperature) { io_write(REFERENCE_REGISTER, referenceTemperature); } int GetTemperature() const { return (io_read(TEMP_MONITORING_REGISTER)); } void AdjustTemperature( int temperature) { // : } void InitializeDevice() { // , } };



  23. class TemperatureController { // int m_referenceTemperature; public : // / // virtual int GetReferenceTemperature() const { return m_referenceTemperature; } virtual void SetReferenceTemperature( int referenceTemperature) { m_referenceTemperature = referenceTemperature; } virtual int GetTemperature() const = 0; virtual void AdjustTemperature( int temperature) = 0; virtual void InitializeDevice() = 0; }; class Brand_C_TemperatureController : public TemperatureController { public : // / int GetReferenceTemperature() const { return (io_read(REFERENCE_REGISTER); } void SetReferenceTemperature( int referenceTemperature) { io_write(REFERENCE_REGISTER, referenceTemperature); } int GetTemperature() const { return (io_read(TEMP_MONITORING_REGISTER)); } void AdjustTemperature( int temperature) { // : } void InitializeDevice() { // , } };



  24. class TemperatureController { // int m_referenceTemperature; public : // / // virtual int GetReferenceTemperature() const { return m_referenceTemperature; } virtual void SetReferenceTemperature( int referenceTemperature) { m_referenceTemperature = referenceTemperature; } virtual int GetTemperature() const = 0; virtual void AdjustTemperature( int temperature) = 0; virtual void InitializeDevice() = 0; }; class Brand_C_TemperatureController : public TemperatureController { public : // / int GetReferenceTemperature() const { return (io_read(REFERENCE_REGISTER); } void SetReferenceTemperature( int referenceTemperature) { io_write(REFERENCE_REGISTER, referenceTemperature); } int GetTemperature() const { return (io_read(TEMP_MONITORING_REGISTER)); } void AdjustTemperature( int temperature) { // : } void InitializeDevice() { // , } };



  25. class TemperatureController { // int m_referenceTemperature; public : // / // virtual int GetReferenceTemperature() const { return m_referenceTemperature; } virtual void SetReferenceTemperature( int referenceTemperature) { m_referenceTemperature = referenceTemperature; } virtual int GetTemperature() const = 0; virtual void AdjustTemperature( int temperature) = 0; virtual void InitializeDevice() = 0; }; class Brand_C_TemperatureController : public TemperatureController { public : // / int GetReferenceTemperature() const { return (io_read(REFERENCE_REGISTER); } void SetReferenceTemperature( int referenceTemperature) { io_write(REFERENCE_REGISTER, referenceTemperature); } int GetTemperature() const { return (io_read(TEMP_MONITORING_REGISTER)); } void AdjustTemperature( int temperature) { // : } void InitializeDevice() { // , } };



  26. class TemperatureController { // int m_referenceTemperature; public : // / // virtual int GetReferenceTemperature() const { return m_referenceTemperature; } virtual void SetReferenceTemperature( int referenceTemperature) { m_referenceTemperature = referenceTemperature; } virtual int GetTemperature() const = 0; virtual void AdjustTemperature( int temperature) = 0; virtual void InitializeDevice() = 0; }; class Brand_C_TemperatureController : public TemperatureController { public : // / int GetReferenceTemperature() const { return (io_read(REFERENCE_REGISTER); } void SetReferenceTemperature( int referenceTemperature) { io_write(REFERENCE_REGISTER, referenceTemperature); } int GetTemperature() const { return (io_read(TEMP_MONITORING_REGISTER)); } void AdjustTemperature( int temperature) { // : } void InitializeDevice() { // , } };



  27. class TemperatureController { // int m_referenceTemperature; public : // / // virtual int GetReferenceTemperature() const { return m_referenceTemperature; } virtual void SetReferenceTemperature( int referenceTemperature) { m_referenceTemperature = referenceTemperature; } virtual int GetTemperature() const = 0; virtual void AdjustTemperature( int temperature) = 0; virtual void InitializeDevice() = 0; }; class Brand_C_TemperatureController : public TemperatureController { public : // / int GetReferenceTemperature() const { return (io_read(REFERENCE_REGISTER); } void SetReferenceTemperature( int referenceTemperature) { io_write(REFERENCE_REGISTER, referenceTemperature); } int GetTemperature() const { return (io_read(TEMP_MONITORING_REGISTER)); } void AdjustTemperature( int temperature) { // : } void InitializeDevice() { // , } };



  28. class TemperatureController { // int m_referenceTemperature; public : // / // virtual int GetReferenceTemperature() const { return m_referenceTemperature; } virtual void SetReferenceTemperature( int referenceTemperature) { m_referenceTemperature = referenceTemperature; } virtual int GetTemperature() const = 0; virtual void AdjustTemperature( int temperature) = 0; virtual void InitializeDevice() = 0; }; class Brand_C_TemperatureController : public TemperatureController { public : // / int GetReferenceTemperature() const { return (io_read(REFERENCE_REGISTER); } void SetReferenceTemperature( int referenceTemperature) { io_write(REFERENCE_REGISTER, referenceTemperature); } int GetTemperature() const { return (io_read(TEMP_MONITORING_REGISTER)); } void AdjustTemperature( int temperature) { // : } void InitializeDevice() { // , } };



  29. class TemperatureController { // int m_referenceTemperature; public : // / // virtual int GetReferenceTemperature() const { return m_referenceTemperature; } virtual void SetReferenceTemperature( int referenceTemperature) { m_referenceTemperature = referenceTemperature; } virtual int GetTemperature() const = 0; virtual void AdjustTemperature( int temperature) = 0; virtual void InitializeDevice() = 0; }; class Brand_C_TemperatureController : public TemperatureController { public : // / int GetReferenceTemperature() const { return (io_read(REFERENCE_REGISTER); } void SetReferenceTemperature( int referenceTemperature) { io_write(REFERENCE_REGISTER, referenceTemperature); } int GetTemperature() const { return (io_read(TEMP_MONITORING_REGISTER)); } void AdjustTemperature( int temperature) { // : } void InitializeDevice() { // , } };



  30. class TemperatureController { // int m_referenceTemperature; public : // / // virtual int GetReferenceTemperature() const { return m_referenceTemperature; } virtual void SetReferenceTemperature( int referenceTemperature) { m_referenceTemperature = referenceTemperature; } virtual int GetTemperature() const = 0; virtual void AdjustTemperature( int temperature) = 0; virtual void InitializeDevice() = 0; }; class Brand_C_TemperatureController : public TemperatureController { public : // / int GetReferenceTemperature() const { return (io_read(REFERENCE_REGISTER); } void SetReferenceTemperature( int referenceTemperature) { io_write(REFERENCE_REGISTER, referenceTemperature); } int GetTemperature() const { return (io_read(TEMP_MONITORING_REGISTER)); } void AdjustTemperature( int temperature) { // : } void InitializeDevice() { // , } };



  31. class TemperatureController { // int m_referenceTemperature; public : // / // virtual int GetReferenceTemperature() const { return m_referenceTemperature; } virtual void SetReferenceTemperature( int referenceTemperature) { m_referenceTemperature = referenceTemperature; } virtual int GetTemperature() const = 0; virtual void AdjustTemperature( int temperature) = 0; virtual void InitializeDevice() = 0; }; class Brand_C_TemperatureController : public TemperatureController { public : // / int GetReferenceTemperature() const { return (io_read(REFERENCE_REGISTER); } void SetReferenceTemperature( int referenceTemperature) { io_write(REFERENCE_REGISTER, referenceTemperature); } int GetTemperature() const { return (io_read(TEMP_MONITORING_REGISTER)); } void AdjustTemperature( int temperature) { // : } void InitializeDevice() { // , } };



  32. class TemperatureController { // int m_referenceTemperature; public : // / // virtual int GetReferenceTemperature() const { return m_referenceTemperature; } virtual void SetReferenceTemperature( int referenceTemperature) { m_referenceTemperature = referenceTemperature; } virtual int GetTemperature() const = 0; virtual void AdjustTemperature( int temperature) = 0; virtual void InitializeDevice() = 0; }; class Brand_C_TemperatureController : public TemperatureController { public : // / int GetReferenceTemperature() const { return (io_read(REFERENCE_REGISTER); } void SetReferenceTemperature( int referenceTemperature) { io_write(REFERENCE_REGISTER, referenceTemperature); } int GetTemperature() const { return (io_read(TEMP_MONITORING_REGISTER)); } void AdjustTemperature( int temperature) { // : } void InitializeDevice() { // , } };



  33. class TemperatureController { // int m_referenceTemperature; public : // / // virtual int GetReferenceTemperature() const { return m_referenceTemperature; } virtual void SetReferenceTemperature( int referenceTemperature) { m_referenceTemperature = referenceTemperature; } virtual int GetTemperature() const = 0; virtual void AdjustTemperature( int temperature) = 0; virtual void InitializeDevice() = 0; }; class Brand_C_TemperatureController : public TemperatureController { public : // / int GetReferenceTemperature() const { return (io_read(REFERENCE_REGISTER); } void SetReferenceTemperature( int referenceTemperature) { io_write(REFERENCE_REGISTER, referenceTemperature); } int GetTemperature() const { return (io_read(TEMP_MONITORING_REGISTER)); } void AdjustTemperature( int temperature) { // : } void InitializeDevice() { // , } };



  34. class TemperatureController { // int m_referenceTemperature; public : // / // virtual int GetReferenceTemperature() const { return m_referenceTemperature; } virtual void SetReferenceTemperature( int referenceTemperature) { m_referenceTemperature = referenceTemperature; } virtual int GetTemperature() const = 0; virtual void AdjustTemperature( int temperature) = 0; virtual void InitializeDevice() = 0; }; class Brand_C_TemperatureController : public TemperatureController { public : // / int GetReferenceTemperature() const { return (io_read(REFERENCE_REGISTER); } void SetReferenceTemperature( int referenceTemperature) { io_write(REFERENCE_REGISTER, referenceTemperature); } int GetTemperature() const { return (io_read(TEMP_MONITORING_REGISTER)); } void AdjustTemperature( int temperature) { // : } void InitializeDevice() { // , } };



  35. class TemperatureController { // int m_referenceTemperature; public : // / // virtual int GetReferenceTemperature() const { return m_referenceTemperature; } virtual void SetReferenceTemperature( int referenceTemperature) { m_referenceTemperature = referenceTemperature; } virtual int GetTemperature() const = 0; virtual void AdjustTemperature( int temperature) = 0; virtual void InitializeDevice() = 0; }; class Brand_C_TemperatureController : public TemperatureController { public : // / int GetReferenceTemperature() const { return (io_read(REFERENCE_REGISTER); } void SetReferenceTemperature( int referenceTemperature) { io_write(REFERENCE_REGISTER, referenceTemperature); } int GetTemperature() const { return (io_read(TEMP_MONITORING_REGISTER)); } void AdjustTemperature( int temperature) { // : } void InitializeDevice() { // , } };



  36. class TemperatureController { // int m_referenceTemperature; public : // / // virtual int GetReferenceTemperature() const { return m_referenceTemperature; } virtual void SetReferenceTemperature( int referenceTemperature) { m_referenceTemperature = referenceTemperature; } virtual int GetTemperature() const = 0; virtual void AdjustTemperature( int temperature) = 0; virtual void InitializeDevice() = 0; }; class Brand_C_TemperatureController : public TemperatureController { public : // / int GetReferenceTemperature() const { return (io_read(REFERENCE_REGISTER); } void SetReferenceTemperature( int referenceTemperature) { io_write(REFERENCE_REGISTER, referenceTemperature); } int GetTemperature() const { return (io_read(TEMP_MONITORING_REGISTER)); } void AdjustTemperature( int temperature) { // : } void InitializeDevice() { // , } };



  37. class TemperatureController { // int m_referenceTemperature; public : // / // virtual int GetReferenceTemperature() const { return m_referenceTemperature; } virtual void SetReferenceTemperature( int referenceTemperature) { m_referenceTemperature = referenceTemperature; } virtual int GetTemperature() const = 0; virtual void AdjustTemperature( int temperature) = 0; virtual void InitializeDevice() = 0; }; class Brand_C_TemperatureController : public TemperatureController { public : // / int GetReferenceTemperature() const { return (io_read(REFERENCE_REGISTER); } void SetReferenceTemperature( int referenceTemperature) { io_write(REFERENCE_REGISTER, referenceTemperature); } int GetTemperature() const { return (io_read(TEMP_MONITORING_REGISTER)); } void AdjustTemperature( int temperature) { // : } void InitializeDevice() { // , } };



  38. class TemperatureController { // int m_referenceTemperature; public : // / // virtual int GetReferenceTemperature() const { return m_referenceTemperature; } virtual void SetReferenceTemperature( int referenceTemperature) { m_referenceTemperature = referenceTemperature; } virtual int GetTemperature() const = 0; virtual void AdjustTemperature( int temperature) = 0; virtual void InitializeDevice() = 0; }; class Brand_C_TemperatureController : public TemperatureController { public : // / int GetReferenceTemperature() const { return (io_read(REFERENCE_REGISTER); } void SetReferenceTemperature( int referenceTemperature) { io_write(REFERENCE_REGISTER, referenceTemperature); } int GetTemperature() const { return (io_read(TEMP_MONITORING_REGISTER)); } void AdjustTemperature( int temperature) { // : } void InitializeDevice() { // , } };



  39. class TemperatureController { // int m_referenceTemperature; public : // / // virtual int GetReferenceTemperature() const { return m_referenceTemperature; } virtual void SetReferenceTemperature( int referenceTemperature) { m_referenceTemperature = referenceTemperature; } virtual int GetTemperature() const = 0; virtual void AdjustTemperature( int temperature) = 0; virtual void InitializeDevice() = 0; }; class Brand_C_TemperatureController : public TemperatureController { public : // / int GetReferenceTemperature() const { return (io_read(REFERENCE_REGISTER); } void SetReferenceTemperature( int referenceTemperature) { io_write(REFERENCE_REGISTER, referenceTemperature); } int GetTemperature() const { return (io_read(TEMP_MONITORING_REGISTER)); } void AdjustTemperature( int temperature) { // : } void InitializeDevice() { // , } };



  40. class TemperatureController { // int m_referenceTemperature; public : // / // virtual int GetReferenceTemperature() const { return m_referenceTemperature; } virtual void SetReferenceTemperature( int referenceTemperature) { m_referenceTemperature = referenceTemperature; } virtual int GetTemperature() const = 0; virtual void AdjustTemperature( int temperature) = 0; virtual void InitializeDevice() = 0; }; class Brand_C_TemperatureController : public TemperatureController { public : // / int GetReferenceTemperature() const { return (io_read(REFERENCE_REGISTER); } void SetReferenceTemperature( int referenceTemperature) { io_write(REFERENCE_REGISTER, referenceTemperature); } int GetTemperature() const { return (io_read(TEMP_MONITORING_REGISTER)); } void AdjustTemperature( int temperature) { // : } void InitializeDevice() { // , } };



  41. class TemperatureController { // int m_referenceTemperature; public : // / // virtual int GetReferenceTemperature() const { return m_referenceTemperature; } virtual void SetReferenceTemperature( int referenceTemperature) { m_referenceTemperature = referenceTemperature; } virtual int GetTemperature() const = 0; virtual void AdjustTemperature( int temperature) = 0; virtual void InitializeDevice() = 0; }; class Brand_C_TemperatureController : public TemperatureController { public : // / int GetReferenceTemperature() const { return (io_read(REFERENCE_REGISTER); } void SetReferenceTemperature( int referenceTemperature) { io_write(REFERENCE_REGISTER, referenceTemperature); } int GetTemperature() const { return (io_read(TEMP_MONITORING_REGISTER)); } void AdjustTemperature( int temperature) { // : } void InitializeDevice() { // , } };



  42. class TemperatureController { // int m_referenceTemperature; public : // / // virtual int GetReferenceTemperature() const { return m_referenceTemperature; } virtual void SetReferenceTemperature( int referenceTemperature) { m_referenceTemperature = referenceTemperature; } virtual int GetTemperature() const = 0; virtual void AdjustTemperature( int temperature) = 0; virtual void InitializeDevice() = 0; }; class Brand_C_TemperatureController : public TemperatureController { public : // / int GetReferenceTemperature() const { return (io_read(REFERENCE_REGISTER); } void SetReferenceTemperature( int referenceTemperature) { io_write(REFERENCE_REGISTER, referenceTemperature); } int GetTemperature() const { return (io_read(TEMP_MONITORING_REGISTER)); } void AdjustTemperature( int temperature) { // : } void InitializeDevice() { // , } };



  43. class TemperatureController { // int m_referenceTemperature; public : // / // virtual int GetReferenceTemperature() const { return m_referenceTemperature; } virtual void SetReferenceTemperature( int referenceTemperature) { m_referenceTemperature = referenceTemperature; } virtual int GetTemperature() const = 0; virtual void AdjustTemperature( int temperature) = 0; virtual void InitializeDevice() = 0; }; class Brand_C_TemperatureController : public TemperatureController { public : // / int GetReferenceTemperature() const { return (io_read(REFERENCE_REGISTER); } void SetReferenceTemperature( int referenceTemperature) { io_write(REFERENCE_REGISTER, referenceTemperature); } int GetTemperature() const { return (io_read(TEMP_MONITORING_REGISTER)); } void AdjustTemperature( int temperature) { // : } void InitializeDevice() { // , } };



  44. class TemperatureController { // int m_referenceTemperature; public : // / // virtual int GetReferenceTemperature() const { return m_referenceTemperature; } virtual void SetReferenceTemperature( int referenceTemperature) { m_referenceTemperature = referenceTemperature; } virtual int GetTemperature() const = 0; virtual void AdjustTemperature( int temperature) = 0; virtual void InitializeDevice() = 0; }; class Brand_C_TemperatureController : public TemperatureController { public : // / int GetReferenceTemperature() const { return (io_read(REFERENCE_REGISTER); } void SetReferenceTemperature( int referenceTemperature) { io_write(REFERENCE_REGISTER, referenceTemperature); } int GetTemperature() const { return (io_read(TEMP_MONITORING_REGISTER)); } void AdjustTemperature( int temperature) { // : } void InitializeDevice() { // , } };





ジャンルの法則によれば、クライマックスがあることが明らかになります。 「チェックしてチェックメイト!」と言ってみましょう。



3.4。 あ、何だっけ?


デブリーフィングの前に、Lisk置換の原則を思い出してください。 次のクラスは、基本クラスの動作を置き換えるのではなく、補完する必要があります。 今何をしましたか? そう! GetReferenceTemperatureメソッドとSetReferenceTemperatureメソッドを置き換えました 。 クラス動作を変更しました 。 これは何でいっぱいですか? マウスのホイールが磨耗しないように、クラスの使用を再度引用します。

  1. . . . TemperatureController *pTempCtrl = GetNextTempController(); pTempCtrl->SetReferenceTemperature(10); pTempCtrl->InitializeDevice(); . . .



  2. . . . TemperatureController *pTempCtrl = GetNextTempController(); pTempCtrl->SetReferenceTemperature(10); pTempCtrl->InitializeDevice(); . . .



  3. . . . TemperatureController *pTempCtrl = GetNextTempController(); pTempCtrl->SetReferenceTemperature(10); pTempCtrl->InitializeDevice(); . . .



  4. . . . TemperatureController *pTempCtrl = GetNextTempController(); pTempCtrl->SetReferenceTemperature(10); pTempCtrl->InitializeDevice(); . . .



  5. . . . TemperatureController *pTempCtrl = GetNextTempController(); pTempCtrl->SetReferenceTemperature(10); pTempCtrl->InitializeDevice(); . . .





まだ明確ではありませんか? Brand_AおよびBrand_B機器で作業する場合、すべてが問題ありません。 ただし、Brand_Cを使用する場合は、最初にデバイスに温度を書き込み、次にデバイスのみを初期化します。 このすべてが終わることができるよりも-自分を空想します。 悪いことは何も起こらない可能性があります。 そして、デバッグに半日座る可能性があります。



しかし、Brand_C_TemperatureControllerクラスを作成するときに(より正確には、不運なゲッター/セッターの愚かな再定義中に)置換の原則を覚えていれば、新しい現実で発明した抽象化のモデルは完全にでたらめであると推測できます。 この状況を修正する方法は? 残念ながら、これはこの記事のトピックではありません。 私はすべてにうんざりしていると思います。



4.もっと欲しい!



トピックについて、私は読むことを申し出ることができます:

* ウィキペディアの記事 (最初に警告しました!);

* Liskov Substitution Principle-ここでこのトピックの例を盗みました。

* Google



5.デザート



ああ! 思い出した! 記事は写真で希釈する必要があります。 ここに:

バーバラ・リスコフの代替原理 ©



このやる気を起こさせる人があなたを笑顔にしたなら、あなたは私がそんなに多くのテキストを書いた理由を理解するでしょう。



頑張って 途中でバグが発生する頻度を減らしましょう!



All Articles