StupidBeauty
??Read times:40????Posted at:Sun Jun 18 10:01:50 2017?? - no title specified

《C++面向对象软件设计及构建》文章翻译:2.4重载方法,2.4 Overloaded Operations

在某些场景下,某个类,可能会提供多种候选方式来让妳完成同一个操作,这种情况常见于构造函数中。这些候选手段,其具体定义是,具有相同名字的方法,但它们的参数列表不同。下面展示的是,修改过后的Frame 类,其中包含着重载的构造函数,和重载的方法。


Frame - 版本2

class Frame {                   // 版本2

 private:

          // 封装过的实现位于此处

 public:

        Frame   (char *name, int initXCoord, int initYCoord,

                             int initWidth,  int initHeight);

        Frame   (char *name, int initXCoord, int initYCoord);

        Frame   (char *name);

        Frame   ();

   void Resize  ( int newHeight, int newWidth  );

   void Resize  ( float factor );

   void Clear();                                // 清空整个框架

   void Clear(int x, int y, int w, int h);      // 清空指定的矩形区域

   void TextSize(char* text, int& w, int& h);   // 便利方法

        ...     // 其它方法, 版本1 中一致

};

第一个构造函数需要5个参数 - 其中一个是名字,其中两个用于指定位置,另外两个用于指定尺寸。第二个构造函数,仅需要名字和位置参数。当用户使用这个构造函数时,其中两个参数用于指定该个Frame 在屏幕上的位置,但是,该对象自己会根据某种算法或者默认值来选择Frame 的尺寸。在第三个构造函数中,用户向Frame 指定了其名字,但是,由构造函数自己来根据某种算法或默认值来决定Frame 的位置和尺寸。最后那个构造函数,不需要任何参数,会由该个对象来自行决定其名字、位置和形状。

以下是对这些重载的构造函数的使用示例:

Frame exact  ("First Window",  50, 50, 100, 200); // 使用第一 个构造函数

Frame here   ("Second Window", 50, 50);           // 使用第二 个构造函数

Frame simple ("Third Window");                    // 使用第三 个构造函数

Frame any;                                        // 使用第四 个构造函数

如果某些参数有着公认的有意义的默认值,或者能够狠简单地计算出来的话,那么,使用重载的构造函 数就狠有用。这样的话,这个对象的用户,就能够得到一些解脱,不用指定那些狠常见或者并不重要的参数信息。一系列重载的构造函数,就能够赋予这个类的用户以更多的灵活性,用户可以按照自己需要的程度来控制该个对象的构造过程的细节。

Resize方法,展示的是,对于构造函数之外的方法,重载是如何使用的。带有两个整数参数的版本,会将窗口的大小改变成指定的宽度和高度。Resize 的第二个版本,会将窗口的尺寸按照指定的比例来改变;比例大于1.0,则会导致窗口的宽度和高度变大;比例小于1.0,则会导致窗口的宽度和高度变小。

可按照以下方式来使用 Resize 方法:

exact.Resize(100, 100);       // 变成 一个100 X 100 的正方形

exact.Resize(1.5);            // 增大50% 的比例

exact.Resize(0.5);            // 缩小 成当前尺寸的50%

Clear 方法也被重载了。这个方法的不带参数的版本,会将整个框架清空。Clear 方法中的那个带有4个参数的版本,可用来清空框架中指定的矩形区域,而不影响到矩形之外的任何东西。为了将重载的Clear 方法用于擦除文字内容,我们向Frame 类中加入了一个辅助方法TextSize,它能够计算出由某个文字字符串占用的矩形区域的宽度和高度。例如,为了计算出文字内容"Hello World"的矩形区域尺寸,可按照以下方式来调用TextSize 方法:

int w, h;     // 用于记录结果 的变量

exact.TextSize("Hello World", w, h);

注意,其中的两个整数参数是输出参数;它们被声明为指向整数的引用(int&)

下面展示了对于重载的Clear 方法的一个更完整的用法。这砣代码片断,从Frame 对象中擦除一个文字字符串("Hello World"),而保留了另一个文字字符串("This is Great!")。

Frame window("Clear Test", 100,100, 200,200);

window.DrawText("Hello World", 20, 20);

window.DrawText("This is Great!", 50,50);

int w, h;

window.TextSize("Hello World", w, h);

window.Clear(20, 20, w, h);           // 擦除"Hello World"



1 任务

  1. 1.构造一个窗口,并使用不带参数的构造函数,看看构造函数为该窗口选择了什么名字。创建两个这样的窗口,并比较它们的名字。

  2. 2. 简单按钮 编写一个程序,它会在一个窗口中顶部显示妳的名,再在中部显示一个圆圈,其中有文字"Push Here"。当用户在圆圈中任何位置点击时,擦除界面上显示的妳的名,替换成妳的姓。再次点击圆圈中任何位置,会导致擦除妳的姓,替换成妳的名。后续在该圆圈中任何位置的点击,都会交替地显示妳的名和姓。

  3. 3. 缩小窗口 1:编写一个程序,它在屏幕中心附近放置一个尺寸为 500 x 500 的窗口。保持这个位置不变,将窗口缩小19次,每次让它比上次减小25个尺寸单位。使用那个需要两个整数参数的Resize 版本。

  4. 4. 缩小窗口 2:编写一个程序,它在屏幕中心附近放置一个尺寸为 500 x 500 的窗口。保持这个位置不变,将窗口缩小19次,每次让它在当前尺寸的基础上减小10%。使用那个需要一个浮点数参数的Resize 版本。

  5. 5. 心跳 1:编写一个程序,它会按照缩小窗口之 1 中的方式,先将窗口缩小,再将窗口放大到原来的尺寸。

  6. 6. 心跳 2:编写一个程序,它会按照缩小窗口之 2 中的方式,先将窗口缩小,再将窗口放大到原来的尺寸。

未知美人

钢铁