1. 程式人生 > >LSP里氏替換原則----正方形不是長方形和鴕鳥不是鳥的測試程式

LSP里氏替換原則----正方形不是長方形和鴕鳥不是鳥的測試程式

//面向物件設計原則:LSP里氏替換原則
//正方形不是長方形的測試程式

#include <iostream>
using namespace std;

//長方形類Rectangle
class Rectangle 
{
private:
	int width;
	int height;
public:
	int getWidth(){ return width; }
	virtual void setWidth(int w){ width=w; }
	int getHeight(){ return height; }
	virtual void setHeight(int h){ height=h; } 
};


//正方形類Square
class Square :public  Rectangle 
{public:
   void setWidth(int w) 
    {Rectangle::setHeight(w);
     Rectangle::setWidth(w);  
   }
   void setHeight(int h)
    {Rectangle::setHeight(h);
     Rectangle::setWidth(h);
   } 
};

//測試類 TestRectangle 
class TestRectangle 
{ public:
     void resize(Rectangle &objRect) 
     {while(objRect.getWidth() <= objRect.getHeight() ) 
         {objRect.setWidth( objRect.getWidth() + 1 );}
	  cout<<"resize over!"<<endl;
	  cout<<"height="<<objRect.getHeight()<<"  width="<<objRect.getWidth()<<endl;;
    }
};

//主函式
int main()
{
  Rectangle r;    //父類物件      
  r.setWidth(5);
  r.setHeight(15);
 
  Square s;    //子類物件      
  s.setWidth(5);
  s.setHeight(15);

  TestRectangle t;
  t.resize(r); //ok
  t.resize(s); //用子類物件代替父類物件時,出現無限迴圈

  return 0;
}


 

(2)

//面向物件設計原則:LSP里氏替換原則  
//鴕鳥不是鳥的測試程式
#include <iostream>
using namespace std;

//鳥類Bird
class Bird 
{ 
 private:
   double velocity;
 public:
   virtual void  fly() { cout<<"I can fly!"; }
   virtual void  setVelocity(double v)  { velocity = v; }
   virtual double  getVelocity() { return velocity; }
};

//鴕鳥類Ostrich
class Ostrich :public Bird 
{ public: 
   void fly() { cout<<"i can\'t fly!"; }
   void setVelocity(double v) { Bird::setVelocity(0); }
   double getVelocity() { return Bird::getVelocity(); }
};

//測試類TestBird:
class TestBird
{public:
    void calcFlyTime(Bird &bird)
    {try
 {double riverWidth = 3000;
     if(bird.getVelocity()==0) throw 0;
  cout<<"Velocity="<<bird.getVelocity()<<endl;
  cout<<"Fly time="<<riverWidth/bird.getVelocity()<<endl;
 } catch(int)
 { cout<<"An error occured!"<<endl;  }   
 }
};


//主函式
int main()
{
  Bird b; //父類物件
  b.setVelocity(100);
  Ostrich o;
  o.setVelocity(0);
  TestBird t;
  t.calcFlyTime(b); //ok
  t.calcFlyTime(o); //用子類物件代替父類物件時,出現異常
  return 0;
}



 

 

相關推薦

LSP里氏替換原則----正方形長方形鴕鳥測試程式

//面向物件設計原則:LSP里氏替換原則 //正方形不是長方形的測試程式 #include <iostream> using namespace std; //長方形類Rectangle class Rectangle { private: int wi

面向物件設計原則--里氏替換原則(LSP)依賴倒置原則(DIP)

面向物件設計原則–里氏替換原則(LSP)和依賴倒置原則(DIP) tags:設計模式 LSP–inheritance should ensure that any property prove

第2章 面向物件的設計原則(SOLID):2_里氏替換原則LSP

2. 里氏替換原則(Liskov Substitution Principle,LSP) 2.1 定義 (1)所有使用基類的地方必須能透明地使用子類替換,而程式的行為沒有任何變化(不會產生執行結果錯誤或異常)。只有這樣,父類才能被真正複用,而且子類也能夠在父類的基礎上增加新的行為。也只有這樣

OO設計原則 -- Liskov Substitution Principle: 里氏替換原則(LSP)

概要  Functions that use pointers or references to base classesmust be able to use objects of derived classes without knowing it. 所有引

設計模式學習之設計模式原則(一):單一職責原則里氏替換原則

學習設計模式,以《設計模式之禪》為藍本進行總結與學習,今天先記錄設計模式六大原則的兩個原則:單一職責原則(SRP)和里氏替換原則(LSP)。 單一職責原則 Single Responsibilit

"圍觀"設計模式(2)--里氏替換原則(LSP,Liskov Substitution Principle)

在面向物件的程式設計中,里氏替換原則(Liskov Substitution principle)是對子型別的特別定義。它由芭芭拉·利斯科夫(Barbara Liskov)在1987年在一次會議上名為“資料的抽象與層次”的演說中首先提出。里氏替換原則的內容可以描述為: “派生

[面向物件六大原則] 里氏替換原則(LSP)

里氏替換原則 - Liskov Substitution Principle定義一:如果對每一個型別為S的物件O1,都有型別為T的物件O2,使得以T定義的所有程式P在所有的物件O1都替換成O2時,程式P的行為沒有發生變化,那麼型別S是型別T的子型別。定義二:所有引用基類的地方

設計模式之禪(里氏替換原則)2018-10-19

介面與抽象類的區別: 介面卡模式:使用不同介面的類所提供的服務為客戶端提供它所期望的介面。 實現: 有一個 MediaPlayer 介面和一個實現了 MediaPlayer 介面的實體類 AudioPlayer。預設情況下,AudioPl

面向物件原則里氏替換原則

轉載請註明出處:http://blog.csdn.net/feibendexiaoma/article/details/74391028 一.簡稱 英文全稱是Liskov Substitution Principle, 縮寫是LSP 二.定義 如果對每一個型別為S的物件O1,都

面向物件的五大設計原則里氏替換原則

里氏替換原則(liskov substitution principle,簡稱LSP)的核心只有一句話,subtypes must be substitutable for their base types(子類必須能夠替換成它們的基類),關於它的定義和主要的思想如下: 由於面向物件程式設計

設計原則---里氏替換原則

本文參考自設計模式之禪(第二版)第二章 1.1 愛恨糾葛的父子關係        在面向物件的語言中,繼承是必不可少的、非常優秀的語言機制,它有如下優點: 程式碼共享,減少建立類的工作量,每個子類都擁有父類的方法和屬性; 提高程式碼的重用性; 子類可以形似父

如何理解里氏替換原則

Liskov替換原則核心就是子類能完全替換它的基類。 看上去這個應該與生俱來的能力。面向物件的核心多型,不就是靠這一條實現的。或許從沒有遇到的過子類改寫基類的情況。程式世界可能出現這種情況,而且在不經意之間出現這種情況。比如“鳥”是基類,這個基類有一個“飛翔”的行為。當“

面向物件原則之一 里氏替換原則

原文: 面向物件原則之一 里氏替換原則 前言 面向物件有人分為五大原則,分別為單一職責原則、開放封閉原則、依賴倒置原則、介面隔離原則、里氏替換原則。 也有人分為六大原則,分別為單一職責原則、開放封閉原則、依賴倒置原則、介面隔離原則、里氏替換原則、迪米特法則。   現在我們來介紹里氏替換原則

C#七大設計原則里氏替換原則

里氏替換原則 定義:子型別必須能夠替換掉它們的父型別。 也就說子類可以賦給父類,父類物件可以強制轉化為子類物件。 在面向物件的思想中,派生類擁有基類的所有公開的所有特徵。 當派生類賦值給基類時

關於里氏替換原則與多型概念糾正

public abstract class Quadrangle{ protected abstract void getWidth(); protected abstract void getHeight(); } public class Rectangle exten

面向物件六大原則----里氏替換原則,依賴倒置原則

單一職責原則 英文名稱是Single Responsibility Principle,簡稱SRP 開閉原則英文全稱是Open Close Principle,簡稱OCP 里氏替換原則 英文全稱是Liskov Substitution Principle,簡稱LSP 依賴倒置原則 英文全稱是Depe

設計模式六大原則:里氏替換原則(五)

里氏代換原則是由麻省理工學院(MIT)電腦科學實驗室的Liskov女士,在1987年的OOPSLA大會上發表的一篇文章《Data Abstraction and Hierarchy》裡面提出來的,主要闡述了有關繼承的一些原則,也就是什麼時候應該使用繼承,什麼

(轉)設計模式六大原則(2):里氏替換原則

     肯定有不少人跟我剛看到這項原則的時候一樣,對這個原則的名字充滿疑惑。其實原因就是這項原則最早是在1988年,由麻省理工學院的一位姓裡的女士(Barbara Liskov)提出來的。 定義1:如果對每一個型別為 T1的物件 o1,都有型別為 T2 的物件o2,使

里氏替換原則的優點,理解,以及使用

什麼是里氏替換原則呢?它有兩種定義: ● 第一種定義,也是最正宗的定義:If for each object o1 of type S there is an object o2 of type T such that for all programs P defined i

設計模式原則——里氏替換原則

里氏替換原則(Liskov Substitution Principle) 定義1:如果對每一個型別為 T1 的物件 o1,都有型別為 T2 的物件 o2,使得以 T1 定義的所有程式 P 在所有的物件 o1 都代換成 o2 時,程式 P 的行為沒有發生變化,那麼型別 T2