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;
}



 

 

相关文章

迭代器模式(Iterator)迭代器模式(Iterator)[Cursor]意图...
高性能IO模型浅析服务器端编程经常需要构造高性能的IO模型,...
策略模式(Strategy)策略模式(Strategy)[Policy]意图:定...
访问者模式(Visitor)访问者模式(Visitor)意图:表示一个...
命令模式(Command)命令模式(Command)[Action/Transactio...
生成器模式(Builder)生成器模式(Builder)意图:将一个对...