面向接口編程可以提供更高級的抽象,實現的時候,外部不需要知道內部的具體實現,最簡單的是使用簡單工廠模式來進行實現,比如一個Sensor具有多種表示形式,這時候可以在給Sensor結構體添加一個enum類型的type,對外部來說都是使用通用的函數來獲取相關的Sensor的值:
typedef enum SensorType {SensorTypeForce,SensorTypePosition
}SensorType;
typedef struct Sensor
{SensorType type;float originalValue;float filteredValue;
} Sensor;
void SensorInit(Sensor* sensor_, SensorType type_);
{memset(sensor_, 0, sizeof(Sensor));sensor_->type= type_;
}
float Sensor_GetOriginalValue(Sensor* sensor_)
{switch(sensor_->type){case SensorTypeForce:SensorForce_GetValue();break;case SensorTypePosition:SensorPosition_GetValue();break;}return sensor_->originalValue;
}
這樣對于外部來說我們都只使用同樣的接口就可以實現對各個傳感器的值的采集。
進一步的,如果我們不想用switch-case分支來進行判斷,我們可以往結構體Sensor里插入一個函數指針來指向獲取傳感器值的具體的函數,在初始化的時候就把函數指針賦值給Sensor結構體,類似于C++的多態:
typedef struct Sensor
{float (*GetOriginalValue)(Sensor* sensor);float originalValue;float filteredValue;
} Sensor;
void SensorInit(Sensor* sensor_, float (*SensorGetOriginalValue_)(Sensor*))
{memset(sensor_, 0, sizeof(Sensor));sensor_->GetOriginalValue= SensorGetOriginalValue_;
}
float Sensor_GetOriginalValue(Sensor* sensor_)
{return sensor_->GetOriginalValue(sensor_);
}
只需要具體實現函數指針,獲取傳感器值的函數也不需要暴露給外部,可以在調用SensorInit的文件里同時定義SensorGetOriginalValue的具體實現函數,推薦定義為static函數,這樣實現了函數的隱藏,實現了類似于C++的多態。