泛化其实就是继承关系,还是比较简单的,那么我们就把之前有些问题的博客UML类图重新来实现一次。
依旧是这个图
下面我们来看一个例子
Account.h
1 #include <cstdlib> 2 #include <vector> 3 #include "Bid.h" 4 using namespace std; 5 6 class Account 7 { 8 public: 9 void setBid(Bid*); 10 int calcAsset(); 11 private: 12 vector<Bid*> bidObj; 13 };
Account.cpp
1 #include "Account.h" 2 3 void Account::setBid(Bid *theBid) 4 { 5 bidObj.push_back(theBid); 6 } 7 8 int Account::calcAsset() 9 { 10 int size,theAsset=0; 11 size=bidObj.size(); 12 for(int i=0;i<size;i++) 13 theAsset=theAsset+bidObj[i]->calcAsset(); 14 return theAsset; 15 }
Bid.h
1 #include "Fund.h" 2 3 class Bid 4 { 5 public: 6 void setFund(Fund*); 7 virtual int calcAsset()=0; 8 virtual float getUnit()=0; 9 protected: 10 Fund *fundObj; 11 };
Bid.cpp
1 #include "Bid.h" 2 3 void Bid::setFund(Fund *theFund) 4 { 5 fundObj=theFund; 6 }
Fund.h
1 class Fund 2 { 3 public: 4 Fund(float); 5 float getPrice(); 6 private: 7 float price; 8 };
Fund.cpp
1 #include "Fund.h" 2 3 Fund::Fund(float thePrice) 4 { 5 price=thePrice; 6 } 7 8 float Fund::getPrice() 9 { 10 return price; 11 }
SingleBid.h
1 class SingleBid : public Bid 2 { 3 public: 4 SingleBid(float); 5 int calcAsset(); 6 float getUnit(); 7 private: 8 float unit; 9 };
SingleBid.cpp
1 #include "SingleBid.h" 2 3 SingleBid::SingleBid(float theUnit) 4 { 5 unit=theUnit; 6 } 7 8 int SingleBid::calcAsset() 9 { 10 return unit*fundObj->getPrice(); 11 } 12 13 float SingleBid::getUnit() 14 { 15 return unit; 16 }
RegularBid.h
1 #include <cstdlib> 2 #include <vector> 3 #include "BidItem.h" 4 #include "Bid.h" 5 using namespace std; 6 7 class RegularBid : public Bid 8 { 9 public: 10 RegularBid(); 11 int calcAsset(); 12 float getUnit(); 13 14 private: 15 vector<BidItem*> itemObj; 16 };
RegularBid.cpp
1 #include "RegularBid.h" 2 3 RegularBid::RegularBid() 4 { 5 BidItem *myItem; 6 myItem=new BidItem(59.53); 7 itemObj.push_back(myItem); 8 myItem=new BidItem(89.85); 9 itemObj.push_back(myItem); 10 myItem=new BidItem(91.45); 11 itemObj.push_back(myItem); 12 } 13 14 float RegularBid::getUnit() 15 { 16 int size; 17 float theUnit=0; 18 size=itemObj.size(); 19 for(int i=0;i<size;i++) 20 theUnit=theUnit+itemObj[i]->getUnit(); 21 return theUnit; 22 } 23 24 int RegularBid::calcAsset() 25 { 26 return getUnit()*fundObj->getPrice(); 27 }
BidItem.h
1 class BidItem 2 { 3 public: 4 BidItem(float); 5 float getUnit(); 6 private: 7 float unit; 8 };
BidItem.cpp
1 #include "BidItem.h" 2 3 BidItem::BidItem(float theUnit) 4 { 5 unit=theUnit; 6 } 7 8 float BidItem::getUnit() 9 { 10 return unit; 11 }
main.cpp
1 // main.cpp 2 // 3 4 #include <cstdlib> 5 #include <iostream> 6 #include "SingleBid.h" 7 #include "RegularBid.h" 8 #include "Account.h" 9 #include "Fund.h" 10 using namespace std; 11 12 int main(int argc, char *argv[]) 13 { 14 Fund *myFund; 15 SingleBid *mySingleBid; 16 RegularBid *myRegularBid; 17 Account myAccount; 18 19 myFund=new Fund(19.84); 20 mySingleBid=new SingleBid(935.76); 21 mySingleBid->setFund(myFund); 22 myAccount.setBid(mySingleBid); 23 cout << "大华大华基金单位及净值: " 24 << "(" << mySingleBid->getUnit() << ")" 25 << "(" << myFund->getPrice() << ")" << endl; 26 27 myFund=new Fund(37.83); 28 mySingleBid=new SingleBid(721.45); 29 mySingleBid->setFund(myFund); 30 myAccount.setBid(mySingleBid); 31 cout << "日盛上选基金单位及净值: " 32 << "(" << mySingleBid->getUnit() << ")" 33 << "(" << myFund->getPrice() << ")" << endl; 34 35 myFund=new Fund(49.61); 36 myRegularBid=new RegularBid(); 37 myRegularBid->setFund(myFund); 38 myAccount.setBid(myRegularBid); 39 cout << "富邦长虹基金单位及净值: " 40 << "(" << myRegularBid->getUnit() << ")" 41 << "(" << myFund->getPrice() << ")" << endl << endl; 42 43 cout << "总资产为: " 44 << myAccount.calcAsset() << endl << endl; 45 46 system("PAUSE"); 47 return EXIT_SUCCESS; 48 }
下面我们来画一下UML图,并且用UML自动生成C++代码来做一个比较
生成代码对比
Account.h
达到预期
Bid.h
达到预期
Fund.h
达到预期
SingleBid.h
达到预期
RegularBid.h
达到预期
BidItem.h
达到预期