C++开发中级


996 浏览 5 years, 11 months

2.2 在子类中添加功能

版权声明: 转载请注明出处 http://www.codingsoho.com/

在子类中添加功能

在前面讲述继承的时候,首先描述的技巧就是添加功能。基本上您的程序需要一个类似于WeatherPrediction的类,但是需要添加一些附属功能。使用继承重用代码听起来是个好主意。首先定义一个新类MyWeatherPrediction,这个类从WeatherPrediction继承:

#include "WeatherPrediction.h"
class MyWeatherPrediction: public WeatherPrediction
{
};

前面的类定义可以成功编译。MyWeatherPrediction类已经可以代替WeatherPrediction。这个类可以提供相同的功能,但没有新功能。

开始修改的时候,您可能想要在类中添加摄氏温度的信息。这里有点小问题,因为您不知道这个类内部在做什么。如果所有的内部计算都是使用华氏温度,如何添加对摄氏温度的支持呢?方法之一是采用子类作为用户(可以使用两种温度)以及超类(只理解华氏温度)之间的中间界面。

支持摄氏温度的第一步是添加新的方法,允许客户用摄氏温度(而不是华氏温度)设置当前的温度,从而获取明天的以摄氏温度(而不是华氏温度)表示的天气预报。您还需要包含在摄氏温度以及华氏温度之间转换的辅助方法。这些方法可以是静态方法,因为它们对于类的所有实例都相同。

#include "WeatherPrediction.h"

class MyWeatherPrediction: public WeatherPrediction
{
    public:
        virtual void setCurrentTempCelsius(int inTemp);
        virtual int getTomorrowTempCelsius();
    protected:
        virtual int converCelsiusToFahrenheit(int inCelsius);
        virtual int converFahrenheitToCelsius(int inFahrenheit);
};

新方法遵循与父类相同的命名约定。记住,从其他代码的角度来看,MyWeatherPrediction对象具有MyWeatherPrediction以及WeatherPrediction定义的所有功能。采用父类的命名约定可以提供前后一致的接口。

我们把摄氏温度/华氏温度转换方法的实现作为练习留给大家—这是一种乐趣。另外两个方法更为有趣。为了用摄氏温度设置当前温度,首先您需要转换温度,然后将其以父类可以理解的单位传递给父类。

void MyWeatherPrediction::setCurrentTempCelsius(int inTemp)
{
    int fahrenheitTemp = converCelsiusToFahrenheit(inTemp);
    setCurrentTempFahrenheit(fahrenheitTemp);
}

您已经看到,温度被转换之后这个方法调用了超类中的功能。与此类似,getTomorrowTempCelsius的实现使用了父类的已有功能获取华氏温标表示的温度,但是在返回结果之前将其转换为摄氏温度。

int MyWeatherPrediction::getTomorrowTempCelsius()
{
    int fahrenheitTemp = getTomorrowTempFahrenheit();
    return converFahrenheitToCelsius(fahrenheitTemp);
}

这两个新方法都有效地重用了父类,因为它们以某种方式“封装”了类己有的功能,并提供了使用这些功能的新接口。 您还可以添加与父类己有功能无关的全新功能。例如,您可以添加一个方法从因特网获取其他预报,或者添加一个方法根据天气预报给出建议的活动。