開放方法從c 到d

2021-10-12 06:14:48 字數 4859 閱讀 6946

原位址

早前,參加c++大會,這是常式的大會,我(作者)懷疑c++,不過他們很開闊.為了學習d,我重現yomm11,覺得開放方法很不錯.

成員自由函式.

可以參見c++大神最後一章多方法

開放方法虛函式,只是在類外宣告.經常與多方法混淆,因為他們經常實現在一起,但他們不一樣.開放更重要.

虛函式示例:

介面 動物

類 狗:動物

}類 皮保羅:狗

}空 主(

)

等價開放方法,如下:

匯入 開放方法;

外掛程式(註冊方法)

;介面 動物

類 狗:動物

類 皮保羅:狗

串 踢(虛!動物)

;@方法

串 _踢(狗 狗)

@方法串 _踢(皮保羅 狗)

空 主(

)

分開講:

動物介面的變成自由函式串 踢(虛!動物);,隱式變成顯式引數且帶,表明執行時呼叫.

中的,變成自由函式,且1,@方法註解,2,函式以_開頭,3,隱式本變成顯式狗.

皮保羅一樣,只是變成下個,主中呼叫,變成自由函式,只是由於統調,看起來一樣.

匯入開放方法後,呼叫註冊方法外掛程式,每個匯入開放方法模組,都要這樣.它匹配函式宣告/過載.並建立踢函式,但不是.這是多分發入口.

主,呼叫更新方法.呼叫任何方法及每次動態載入解除安裝方法庫時都要呼叫這個更新方法,一般放在主最開頭.

好處是:不用修改任何類層次,就可獲得多型.甚至可以新增至(物件).

假設,你編寫矩陣庫:有各種風格:對角,三對角,淺,稀疏,密集,可優化部分.如轉置對稱/對角,不用變.加稀疏矩陣不用到處加0.你用虛函式實現.很乾淨.

但是,我問你,你該提供永久列印功能嗎?

基本上不應該,有各種矩陣,各種顯示方法,應該由應用程式提供如何顯示.遊戲程式設計中,可能不需要列印函式.如果給定實現,所有**又要加入中,不太好.

現在,應用程式,又不得不寫這些列印函式.但是,他們又需要多型來滿足不同矩陣的需要.導致大堆型別切換.

開放方法,則更乾淨.

空 列印(虛!矩陣 m)

;@方法

空 _列印(矩陣 m)

寫行();

}}@方法空 _列印(對角線矩陣 m)

不喜歡訪問者模式:

訪問者反模式,要求,基類知道所有派生類.不一定.訪問者還是不錯的,見訪問者模式

匯入 標.標io;

介面 矩陣

空 接受(訪問者 v);}

類 密集矩陣:矩陣

}類 對角線矩陣:矩陣

}類 列印訪問者:矩陣.訪問者

空 訪問(密集矩陣 m)

空 訪問(對角線矩陣 m)

檔案 of;

}空 主(

)

冗長,且不可擴充套件.如使用者想新增稀疏矩陣,沒辦法.但用開放方法,則簡單,可用,優雅:

//[!注釋004]

空 列印(虛!矩陣 m,檔案 of)

;@方法

空 _列印(密集矩陣 m,檔案 of)

@方法空 _列印(對角線矩陣 m,檔案 of)

//[!注釋005]

類 稀疏矩陣:矩陣

@方法空 _列印(稀疏矩陣 m,檔案 of)

根據兩個或多個引數,來分發行為,許多語言只有支援單分發虛函式,只能通過型別開關/訪問者來實現,一些語言通過多方法解決了,如(公共lisp),一些語言最近本地支援了:閉包/julia/nice/cecil/tads.

本庫也實現了.且不限制引數個數.你只需要加個虛!.

減/乘操作,各種矩陣對角/三對角/稀疏/密集等.

開放方法,沒問題:

模組 矩陣;

矩陣 加(虛!矩陣,虛!矩陣)

;模組 密集矩陣;

@方法矩陣 _加(矩陣 a,矩陣 b)

@方法矩陣 _加(密集矩陣 a,密集矩陣 b)

模組 對角線矩陣;

@方法矩陣 _加(對角線矩陣 a,對角線矩陣 b)

可擴充套件,插入新型別,很簡單.

模組 我的矩陣;

@方法矩陣 _加(稀疏矩陣 a,稀疏矩陣 b)

@方法矩陣 _加(稀疏矩陣 a,對角線矩陣 b)

@方法矩陣 _加(對角線矩陣 a,稀疏矩陣 b)

實現注意與效能.

用的是指標表來實現,類似普通虛函式呼叫.每個虛分發都有個關聯方法表.作為函式宣告/類/介面虛引數.預設在類資訊析構器指標中儲存關聯類的方法表指標.虛表的第一項為類資訊指標.析構器指標用來實現過時的刪方法,所以重複利用它.可能會刪除這個析構器指標或已利用.有替代方法.用@成針("雜湊")來標記,這樣更新函式時,計算完全數雜湊索引來從陣列中取方法表指標.等價於用整乘虛針值並應用位掩碼.

方法表對每個方法,每個虛參有乙個項.如方法只有虛參,則特定位址.否則該項包括:第乙個參多維分發表指標,及後續參整數索引.

由於方法集,僅在執行時才知道,且動態載入時可能改變,方法表中的不是固定的.多分發時,每方法的步數可轉換多維索引線性偏移.

開放方法編譯器支援的虛方法差不多快.慢的原因主要有編譯器,從介面還是類呼叫.gdc,ldc要快點.

雙分發雙方法好,而c++不是這樣.

d的優勢是模板外掛程式,串外掛程式,編譯時反射別名.外掛程式(註冊方法)掃瞄整個翻譯單元並:

1,檢測含虛!簽名來定位所有方法宣告.

2,用相同簽名通過串外掛程式建立的別名,減去限定,就是使用者呼叫的.

3,找所有@方法方法,並在執行時相應註冊適當方法.

d版本更.

Postgre日誌相關(從開放日誌到配置日誌)

原文 postgre日誌相關 從開放日誌到配置日誌 配置postgre日誌的功能 找到postgresql.conf 在安裝檔案裡面的data資料夾裡面 在when to log的標題下,找到 postgresql.conf日誌部分的註解 special values u user name d d...

從方法到物件導向

乙個星期結束了,從方法到物件導向,寫乙個總結。方法,方法的過載,遞迴等等,遞迴是乙個比較吃力不討好的程式設計技巧,迴圈出來以後就很少用了。之後便是陣列,一組相同型別資料的有序集合。它的特點是每個陣列元素可通過乙個下標來訪問,長度確定,且不可更改,而且元素必須是相同型別。宣告方式有靜態和動態兩種,有乙...

1688開放平台從應用建立到應用上線

一股辛酸淚,有苦說不出。都說1688政策規則太硬,這一段時間算是體驗到了。從6月份建立1688應用到上線居然花了接近3個月時間,雖然中途一段時間沒有去管。但是不得不說,太難了,碰到了好多問題,自己做個筆記,怕以後又忘記了,也給大家做個提醒。前方高能,要呼叫1688介面許可權如果要正式上線的話,必須要...