Thrift 原始碼中見到 read() 呼叫 read_virt(),而非直接虛擬 read(),這是經典的 NVI (Non-Virtual Interface) 模式。
class Base {
public:
// 公開非虛擬介面:封裝不變的前置/後置邏輯
void read() {
preRead(); // 1. 前置檢查、日誌、鎖定
read_virt(); // 2. 委派給虛擬函數實作多型
postRead(); // 3. 後置清理、解鎖、通知
}
private:
virtual void read_virt() = 0; // 純虛擬,子類實作核心邏輯
void preRead() { /* 共用邏輯 */ }
void postRead() { /* 共用邏輯 */ }
};
preRead/postRead 可再虛擬化,允許子類微調。參考:NVI 模式詳細解析