原位址
早前,參加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介面許可權如果要正式上線的話,必須要...