thrift之默認傳輸類TTransportDefaults和虛擬傳輸類TVirtualTransport

默認傳輸類TTransportDefaults提供了抽象類TTransport的默認實現,實現了非虛擬的方法(*_virt) read(), readAll(), write(),borrow() and consume()。基類TTransport總是調用對應的虛擬函數,而默認傳輸類按照默認的方式實現而不去自己在覆蓋哪些對應的虛擬函數了。
  其實這個默認傳輸類的主要作用是作爲虛擬傳輸類TVirtualTransport的父類,那麼爲什麼需要這個類作爲虛擬傳輸類的父類而不是直接採用抽象基類?由下面介紹虛擬基類的實現方式來決定的,因爲爲了避免採用虛基類,所以虛擬傳輸類採用了模板的方式來實現多繼承(同時從兩個類繼承),也就是說可以從一個默認的類繼承,而另一個類採用模板參數傳遞。而默認傳輸類的作用就是防止那些沒有實現默認傳輸類實現的方法的子類造成遞歸調用(死循環了)。
  虛擬傳輸類的實現方式已經在上面介紹了,這樣實現的好處就是避免了採用虛擬繼承,而虛擬繼承會造成一定性能的損失。下面是虛擬基類的實現代碼(省略部分函數):
  template <class Transport_, class Super_=TTransportDefaults>
  class TVirtualTransport : public Super_ {
   public:
    //實現虛擬函數來調用模板參數傳遞進來的具體某一個傳輸類的非虛擬函數
    virtual uint32_t read_virt(uint8_t* buf, uint32_t len) {
      return static_cast<Transport_*>(this)->read(buf, len);
    }
     ......
  }
  費了這麼大的皺褶就爲了擺脫虛擬繼承,看樣子想要提高代碼執行的效率確實不是那麼簡單的事情,不過也證明了一點,巧妙的編程思路和編程技巧也是提高代碼效率很重要的一種方式。上面雖然沒有采用虛擬繼承,但是它的擴展性依然沒有受到一點點影響。例如我們想要實現一個自己的傳輸類用於特殊的目的,那麼只需要從虛擬傳輸類繼承,如:class MyTransport : public TVirtualTransport<MyTransport> {...};然後實現自己的read(), readAll()等等函數(非虛擬的)。
  默認傳輸類和虛擬傳輸類都是爲了實現整個傳輸層體系結構的幫助類,並沒有實現具體的什麼傳輸功能,不過後面介紹的具體的大部分傳輸類都是基於這兩個類之上(繼承),那麼我們就開始看看一些重要的傳輸類的實現。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章