abc_begin

导航

UML类图

之前自己常用如下方法建立类图 

这是之前的方法,其实不应该这样,应该建立一个empty的project

选择model --> profile

选择C++ Profile和UML Standard Profile

把项目的名字改一下

右键点击,选择Add --> Model

改个名字

再改个名字,就默认出来了类的那些选项卡了

下面开始画了,我们先来看一个最最简单的类吧,如下:

Fund.h

1 class Fund
2 { 
3 public:
4     Fund(float);
5     float getPrice();
6 private:
7     float price;
8 };

Fund.cpp

1 Fund::Fund(float thePrice)
2 {
3     price=thePrice;
4 }
5 
6 float Fund::getPrice()
7 {
8     return price;
9 }

 

单击出现的price

这就算自动更新完毕了

我们的一个函数也就如此完成了

这种我们就直接输入getPrice(): float,免得一堆麻烦事情!

然后我们再来看一个类,如下:

Bid.h

1 class Bid 
2 {
3 public:
4     void setFund(Fund*);
5     virtual int calcAsset()=0; 
6     virtual float getUnit()=0;
7 protected:
8     Fund *fundObj; 
9 };

Bid.cpp

1 void Bid::setFund(Fund *theFund)
2 {
3      fundObj=theFund;
4 }

 

对于抽象类,我们选中右边的IsAbstract

type只能手动填写了

指定某个函数是抽象操作

相同的东西我们不再赘述了,直接搞就得了

下面我们来建立类Bid和类Fund的关系吧

下面再搞其他的类,定义如下:

RegularBid.h

 1 class RegularBid : public Bid
 2 {
 3 public:
 4     RegularBid();  
 5     int calcAsset();
 6     float getUnit();   
 7     
 8 private:
 9     vector<BidItem*> itemObj;
10 };

再来看类BidItem:

BidItem.h

1 class BidItem 
2 {
3 public:
4     BidItem(float); 
5     float getUnit();
6 private:
7     float unit;
8 };

BidItem.cpp

1 BidItem::BidItem(float theUnit)
2 { 
3      unit=theUnit;
4 }
5 
6 float BidItem::getUnit()
7 {
8     return unit;
9 }

 

取消导航性,即不支持反向链接

然后再完成其他的类图

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 SingleBid::SingleBid(float theUnit)
 2 {
 3     unit=theUnit; 
 4 } 
 5 
 6 int SingleBid::calcAsset()
 7 {
 8     return unit*fundObj->getPrice();
 9 }
10 
11 float SingleBid::getUnit()
12 {
13     return unit;
14 } 

 Account.h

1 class Account 
2 {
3 public:
4     void setBid(Bid*); 
5     int calcAsset(); 
6 private:
7     vector<Bid*> bidObj;
8 };

Account.cpp

 1 void Account::setBid(Bid *theBid)
 2 { 
 3      bidObj.push_back(theBid);
 4 }
 5 
 6 int Account::calcAsset()
 7 {
 8      int size,theAsset=0;
 9      size=bidObj.size();
10      for(int i=0;i<size;i++)
11          theAsset=theAsset+bidObj[i]->calcAsset();
12      return theAsset; 
13 } 

 

 

图都画完了,然后可以导出C++文件,我们来看一下导出的文件和我们期望的文件的不同:

(1)Account.h

UML图中的表现形式和我们实际希望的代码还是有出入的……

(update 2017-10-29)该问题已解决,具体可以参见UML类图详解_关联关系_一对多,里面对未达到预期的原因做了详细解释以及规避方法

(2)Bid.h

达到预期

(3)BidItem.h

达到预期

(4)Fund.h

达到预期

(5)RegularBid.h

UML图中的表现形式和我们实际希望的代码还是有出入的…… 

(update 2017-10-29)该问题已解决,具体可以参见UML类图详解_组合关系,里面对未达到预期的原因做了详细解释以及规避方法

(6)SingleBid.h

达到预期

 

(update 2017-10-29)总结两点:

1、一旦类图里面包含了一次成员那么在XX端点再声明一次的话就会重复,另外如果不在类图里面包含一次成员而在XX端点处声明一次的话生成的代码比较傻,很多情况下无法满足我们的要求。所以我们就是把成员都在类图里面包含进去,XX端点处就是声明一下多重性,而不要再声明成员就可以了。这就可以解决上面两处生成的代码没有满足我们需求的问题。

2、本篇博客是刚接触UML时所写,图画得还是有些问题的,后来又重新研究了一下,重新汇总了一下,具体见UML类图详解_泛化关系。 

 

posted on 2017-10-28 12:14  LastBattle  阅读(550)  评论(0编辑  收藏  举报