設為首頁收藏本站Access中國

Office中國論壇/Access中國論壇

 找回密碼
 注冊

QQ登錄

只需一步,快速開始

tag 標簽: Freebasic集合類

相關帖子

版塊 作者 回復/查看 最后發(fā)表

沒有相關內容

相關日志

分享 在FreeBasic中使用集合類(泛型)(第五節(jié))--集合類的系列化和反系列化
ganlinlao 2015-5-22 12:28
集合類的系列化和反系列化 (注:本節(jié)內容很重要,在后面的數(shù)據(jù)庫對象映射,就依賴于集合類的系列化和反系列化,此內容要細細揣摩) 在使用集合時,您可能需要將集合中的內容序列化成字符串。所有的集合類都可以轉換為普通的字符串。你可以使用 Cast(操作符),Str(函數(shù)) 或 本庫中的tostring () 方法,很容易可以把集合中的內容序列化成字符串,但要將這些字符串反序列化到list或map或許更難一些。 mdCollectionsHelper 提供了一些靜態(tài)方法: (mdCollectionHelper自動引用了mdList.bi和mdMap.bi) createList(String) As mdList(String) :將字符串生成一個字符型list列表 createMap(String) As mdMap(String, String) :將字符串生成一個map字典 encode(String) As String :將一個普通字符串按區(qū)隔符"[]{}=,\r\n"等生成字符串 decode(String) As String :去掉區(qū)隔符生成一個普通字符串 下面的例子將演示如何進行集合類的系列化: #include once "md/helper/mdCollectionsHelper.bi" '先聲明好map的類型,mdCollectionsHelper很快會用到它 mdMapDeclare(string,string) '定義一些自定義類型(或類) type Myclass declare constructor() declare constructor( byref m as mdMap(string,string) declare operator cast() as string ‘必須聲明 label as string value as integer weight as double end type '聲明之后的代碼實現(xiàn) constructor myclass() end constructor '接下來的構造器用來初始化創(chuàng)建一個map對象,并將map的內容填入自定義類型的字段 constructor myClass(byref m as mdmap(string,string)) this.label=mdcollectionsHelper.decode(m.get("label") this.value=valint(m.get("value")) this.weight=val(m.get("weight")) end constructor operator myclass.cast() as string dim temp as string dim m as mdMap(string,string) temp=m.put("label",mdcollectionsHelper.encode(this.label)) ‘encode不是必須的,但對字符串encode也不是什么壞主意 temp=m.put("value",str(this.value)) temp=m.put("weight",str(this.weight)) return m end operator operator =(byref lhs as myclass,byref rhs as myclass) as boolean return str(lhs)=str(rhs) end operator '接下來開始實例化,并應用到具體的數(shù)據(jù)中 mdListDeclare(myclass) dim listofMyclass as mdlist(myclass) For i As Integer = LBound(firstArray) To UBound(firstArray) firstArray(i).label = "label" Str(i) firstArray(i).value = i firstArray(i).weight = i * 1.1 listOfMyClass.add(firstArray(i)) Next '讓我們看看我們創(chuàng)建的列表的輸出 — 事實上,我們可以通過網(wǎng)絡將數(shù)據(jù)發(fā)送出去,或將它保存到一個文件或任何需要的地方...... Dim As String stringRepresentation = listOfMyClass Print "List as string: " stringRepresentation Print '將字符串反序列回列表 Dim As mdList(String) listOfMaps = mdCollectionsHelper.createList(stringRepresentation) Dim As MyClass newArray(0 To listOfMaps.size() - 1) For i As Integer = LBound(newArray) To UBound(newArray) newArray(i) = TypeMyClass(mdCollectionsHelper.createMap(listOfMaps.get(i))) Print i, newArray(i) Next Sleep
個人分類: FreeBasic|1932 次閱讀|0 個評論
分享 在FreeBasic中使用集合類(泛型)(第四節(jié))
ganlinlao 2015-5-21 21:38
Map接口使用的例子: mdMap 是默認的鍵值存儲。正常情況下,你不應當使用內部類 mdMapEntry,除非在mdMap中使用方法 entrySet()來返回 mdMapEntries mdSet。 mdDictionary 和 mdHashtable 和mdMap 幾乎是一樣的。 mdProperties 是一個對map的擴展類,mdProperties的鍵和值的類型總是字符串。(此類還沒有完全實現(xiàn)。) #Include Once "md/util/mdMap.bi" mdMapDeclare(String, String) Dim As mdMap(String, String) map Dim As String temp temp = map.put("key1", "value1") temp = map.put("key2", "value2") temp = map.put("key3", "value3") Dim As mdSet(String) set = map.keySet() Dim As String element ForEach(String, element In set) Print "key: " element " - value: " map.get(element) NextEach Sleep 使用mdIterator的例子: mdIterator 允許輕松地遍歷列表類。此外,它定義一個 ForEach 宏,允許使用類似 Java 的語法。 mdArrayIterator 擴展了 mdIterator 類 ,同樣也定義了ForEach 宏。使用它,可以遍歷 FreeBASIC 任何類型的數(shù)組。 mdEnumeration 跟 mdIterator 幾乎一樣。大多數(shù)時候,您將使用 mdIterator,但在某些場合下,你可能會用到mdEnumerations。 使用mdIterator的例子: #include once "md/util/mdlist.bi" mdListDeclare(string) '聲明類型 dim list as mdList(string) ‘聲明list對象類型 list.add("0") list.add("1") list.add("2") list.add("3") list.add("4") list.add("5") dim as mdIterator(string) it=list.iterator() '第一次迭代 while it.hasnext() print it.next() wend '第二次迭代 dim element as string foreach(string,element in list) print element nexteach sleep mdArrayIterator使用的例子: #include once "md/util/mdAarrayIterator.bi" mdAarrayIteratorDclare(string) dim array(0 to 9) for i as integer=0 to 9 array(i)=str(i) next dim as mdAarrayIterator(string) it=array() '首次迭代 while it.hasnext() print it.next() wend '第二次迭代 dim element as string foreach(string,element in array()) print element nexteach sleep mdEnumeration使用的例子: #include"md/util/mdEnumeration.bi" mdEnumerationDeclare(string) dim list as mdList(string) list.add("0") list.add("1") list.add("2") list.add("3") list.add("4") dim as mdenumeration(string) e=list while e.hasMoreElements() print e.nextElement wend sleep
個人分類: FreeBasic|1954 次閱讀|0 個評論
分享 在FreeBasic中使用集合類(泛型)(第二節(jié))
ganlinlao 2015-5-21 15:03
泛型知識: 一般我們并不需要太多了解泛型,因為Freebasic主要是和c一樣,通過宏來實現(xiàn)和泛型類似的功能。一般泛型主要是應用在集合類中。但在這里還是有必要適度了解一下泛型的概念,以便于以后在進行類的封裝時,適度使用泛型會帶來更多的方面。 (注:vba中沒有泛型的概念,因為VBA中有一個萬能而讓人痛苦不堪的Variant類型) ************************************************************ 以下內容是java的泛型基礎 ************************************************************ 1、什么是泛型? 泛型是指在定義類或者接口的時候可以為類和接口指定類型形參,在定義變量、定義方法是該類型形參可以當做普通的類型來使用,并且該類型形參在定義變量和創(chuàng)建對象的確定。它的本質是參數(shù)化類型,也就是說所操作的數(shù)據(jù)類型被指定為一個參數(shù)。這種參數(shù)類型可以用在類、接口和方法的創(chuàng)建中,分別稱為泛型類、泛型接口、泛型方法。 Java語言引入泛型的好處是安全簡單。 在引入泛型之前,Java類型分為原始類型、復雜類型,其中復雜類型分為數(shù)組和類。引入泛型后,一個復雜類型就可以在細分成更多的類型。 例如原先的類型List,現(xiàn)在在細分成ListObject, ListString等更多的類型。 注意,現(xiàn)在ListObject, ListString是兩種不同的類型, 他們之間沒有繼承關系,即使String繼承了Object。下面的代碼是非法的 ListString ls = new ArrayListString(); ListObject lo = ls; 這樣設計的原因在于,根據(jù)lo的聲明,編譯器允許你向lo中添加任意對象(例如Integer),但是此對象是 ListString,破壞了數(shù)據(jù)類型的完整性。 在引入泛型之前,要在類中的方法支持多個數(shù)據(jù)類型,就需要對方法進行重載,在引入泛型后,可以解決此問題 (多態(tài)),更進一步可以定義多個參數(shù)以及返回值之間的關系。 例如 public void write(Integer i, Integer da); 的泛型版本為 public T void write(T t, T iListArray; new ArrayListInteger ;//編譯時錯誤 5. 實現(xiàn)原理 5.1. Java泛型時編譯時技術,在運行時不包含泛型信息,僅僅Class的實例中包含了類型參數(shù)的定義信息。 泛型是通過java編譯器的稱為擦除(erasure)的前端處理來實現(xiàn)的。你可以(基本上就是)把它認為是一個從源 碼到源碼的轉換,它把泛型版本轉換成非泛型版本。 基本上,擦除去掉了所有的泛型類型信息。所有在尖括號之間的類型信息都被扔掉了,因此,比如說一個 ListString類型被轉換為List。所有對類型變量的引用被替換成類型變量的上限(通常是Object)。而且, 無論何時結果代碼類型不正確,會插入一個到合適類型的轉換。 T T badCast(T t, Object o) { return (T) o; // unchecked warning } 類型參數(shù)在運行時并不存在。這意味著它們不會添加任何的時間或者空間上的負擔,這很好。不幸的是,這也意味 著你不能依靠他們進行類型轉換。 5.2.一個泛型類被其所有調用共享 下面的代碼打印的結果是什么? ListString l1 = new ArrayListString(); ListInteger l2 = new ArrayListInteger(); System.out.println(l1.getClass() == l2.getClass()); 或許你會說false,但是你想錯了。它打印出true。因為一個泛型類的所有實例在運行時具有相同的運行時類(class), 而不管他們的實際類型參數(shù)。 事實上,泛型之所以叫泛型,就是因為它對所有其可能的類型參數(shù),有同樣的行為;同樣的類可以被當作許多不同 的類型。作為一個結果,類的靜態(tài)變量和方法也在所有的實例間共享。這就是為什么在靜態(tài)方法或靜態(tài)初始化代碼 中或者在靜態(tài)變量的聲明和初始化時使用類型參數(shù)(類型參數(shù)是屬于具體實例的)是不合法的原因。 5.3. 轉型和instanceof 泛型類被所有其實例(instances)共享的,另一個暗示是檢查一個實例是不是一個特定類型的泛型類是沒有意義的。 Collection cs = new ArrayListString(); if (cs instanceof CollectionString) { ...} // 非法 類似的,如下的類型轉換 CollectionString cstr = (CollectionString) cs; 得到一個unchecked warning,因為運行時環(huán)境不會為你作這樣的檢查。 6. Class的泛型處理 Java 5之后,Class變成泛型化了。 JDK1.5中一個變化是類 java.lang.Class是泛型化的。這是把泛型擴展到容器類之外的一個很有意思的例子。 現(xiàn)在,Class有一個類型參數(shù)T, 你很可能會問,T 代表什么?它代表Class對象代表的類型。比如說, String.class類型代表 ClassString,Serializable.class代表 ClassSerializable。 這可以被用來提高你的反射代碼的類型安全。 特別的,因為 Class的 newInstance() 方法現(xiàn)在返回一個T, 你可以在使用反射創(chuàng)建對象時得到更精確的類型。 比如說,假定你要寫一個工具方法來進行一個數(shù)據(jù)庫查詢,給定一個SQL語句,并返回一個數(shù)據(jù)庫中符合查詢條件 的對象集合(collection)。 一個方法是顯式的傳遞一個工廠對象,像下面的代碼: interface FactoryT { public T[] make(); } public T CollectionT select(FactoryT factory, String statement) { CollectionT result = new ArrayListT(); /* run sql query using jdbc */ for ( int i=0; i10; i++ ) { /* iterate over jdbc results */ T item = factory.make(); /* use reflection and set all of item’s fields from sql results */ result.add( item ); } return result; } 你可以這樣調用: select(new FactoryEmpInfo(){ public EmpInfo make() { return new EmpInfo(); } } , ”selection string”); 也可以聲明一個類 EmpInfoFactory 來支持接口 Factory: class EmpInfoFactory implements FactoryEmpInfo { ... public EmpInfo make() { return new EmpInfo();} } 然后調用: select(getMyEmpInfoFactory(), "selection string"); 這個解決方案的缺點是它需要下面的二者之一: 調用處那冗長的匿名工廠類,或為每個要使用的類型聲明一個工廠類并傳遞其對象給調用的地方 這很不自然。 使用class類型參數(shù)值是非常自然的,它可以被反射使用。沒有泛型的代碼可能是: Collection emps = sqlUtility.select(EmpInfo.class, ”select * from emps”); ... public static Collection select(Class c, String sqlStatement) { Collection result = new ArrayList(); /* run sql query using jdbc */ for ( /* iterate over jdbc results */ ) { Object item = c.newInstance(); /* use reflection and set all of item’s fields from sql results */ result.add(item); } return result; } 但是這不能給我們返回一個我們要的精確類型的集合,F(xiàn)在Class是泛型的,我們可以寫: CollectionEmpInfo emps=sqlUtility.select(EmpInfo.class, ”select * from emps”); ... public static T CollectionT select(ClassTc, String sqlStatement) { CollectionT result = new ArrayListT(); /* run sql query using jdbc */ for ( /* iterate over jdbc results */ ) { T item = c.newInstance(); /* use reflection and set all of item’s fields from sql results */ result.add(item); } return result; } 來通過一種類型安全的方式得到我們要的集合。 這項技術是一個非常有用的技巧,它已成為一個在處理注釋(annotations)的新API中被廣泛使用的習慣用法。 **************************************************************** 以上內容是java的泛型基礎 *************************************************************** 如果依然對泛型的概念不是很了解的話,可參看c#的泛型概念
個人分類: FreeBasic|1912 次閱讀|0 個評論

QQ|站長郵箱|小黑屋|手機版|Office中國/Access中國 ( 粵ICP備10043721號-1 )  

GMT+8, 2025-7-17 03:27 , Processed in 0.066093 second(s), 15 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

返回頂部