source: Include/Classes/System/TypeInfo.ab@ 195

Last change on this file since 195 was 195, checked in by dai, 17 years ago

オブジェクトの循環参照を許容した(構造体はダメ)。
抽象クラスをメンバの型に指定できるようにした。
メンバがオブジェクトだったとき、自動的にNewするのをやめ、初期値としてNothingを指定するようにした。

【ArrayListの改良】
・ArrayList_Elementを廃止し、実装をArrayListのprivateに置いた。
・一通りのパラメータを*ObjectからObjectへ変更した。

【その他】
・TypeInfo改良中...
・Objectクラスに実行時型情報用のtypeInfoメンバを追加した。

File size: 5.4 KB
Line 
1' 実装中...
2'(※ まだ組み込んでいません)
3
4
5'Namespace System
6
7
8Class TypeInfo
9Public
10
11 Sub TypeInfo()
12 End Sub
13
14
15 '----------------------------------------------------------------
16 ' Public properties
17 '----------------------------------------------------------------
18
19 Abstract Function BaseType() As TypeInfo
20 Abstract Function FullName() As String
21 Abstract Function IsArray() As Boolean
22 Abstract Function IsByRef() As Boolean
23 Abstract Function IsClass() As Boolean
24 Abstract Function IsEnum() As Boolean
25 Abstract Function IsInterface() As Boolean
26 Abstract Function IsPointer() As Boolean
27 Abstract Function IsValueType() As Boolean
28 Abstract Function Name() As String
29 Abstract Function Namespace() As String
30
31
32
33 '----------------------------------------------------------------
34 ' Public methods
35 '----------------------------------------------------------------
36
37End Class
38
39
40' 中間的な実装(継承専用)
41Class TypeBaseImpl
42 Inherits TypeInfo
43
44 name As String
45 strNamespace As String
46
47 baseType As TypeInfo
48 'interfaces As f(^^;;;
49
50Protected
51
52 Sub TypeBaseImpl()
53 name = ""
54 strNamespace = ""
55 baseType = Nothing
56 End Sub
57
58 Sub TypeBaseImpl( name As String, strNamespace As String )
59 This.name = name
60 This.strNamespace = strNamespace
61 This.baseType = Nothing
62 End Sub
63
64 Sub TypeBaseImpl( name As String, strNamespace As String, baseType As TypeInfo )
65 This.name = name
66 This.strNamespace = strNamespace
67 This.baseType = baseType
68 End Sub
69
70 /*
71 Sub TypeBaseImpl( name As String, strNamespace As String, baseType As Type, interfaces As ... )
72 TypeBaseImpl( name, strNamespace, baseType )
73 End Sub
74 */
75
76Public
77
78
79 '----------------------------------------------------------------
80 ' Public properties
81 '----------------------------------------------------------------
82
83 Override Function BaseType() As TypeInfo
84 Return baseType
85 End Function
86
87 Override Function FullName() As String
88 Return strNamespace + "." + name
89 End Function
90
91 Override Function IsArray() As Boolean
92 Return False
93 End Function
94
95 Override Function IsByRef() As Boolean
96 Return False
97 End Function
98
99 Override Function IsClass() As Boolean
100 Return False
101 End Function
102
103 Override Function IsEnum() As Boolean
104 Return False
105 End Function
106
107 Override Function IsInterface() As Boolean
108 Return False
109 End Function
110
111 Override Function IsPointer() As Boolean
112 Return False
113 End Function
114
115 Override Function IsValueType() As Boolean
116 Return False
117 End Function
118
119 Override Function Name() As String
120 Return name
121 End Function
122
123 Override Function Namespace() As String
124 Return strNamespace
125 End Function
126
127
128
129 '----------------------------------------------------------------
130 ' Public methods
131 '----------------------------------------------------------------
132
133End Class
134
135
136' 値型を管理するためのクラス
137Class _System_TypeForValueType
138 Inherits TypeBaseImpl
139Public
140 Sub _System_TypeForValueType( name As String )
141 TypeInfo( name, "" )
142 End Sub
143
144 Override Function IsValueType() As Boolean
145 Return True
146 End Function
147End Class
148
149' クラスを管理するためのクラス
150Class _System_TypeForClass
151 Inherits TypeBaseImpl
152Public
153 Sub _System_TypeForClass( name As String, strNamespace As String, baseType As TypeInfo )
154 TypeBaseImpl( name, strNamespace, baseType )
155 End Sub
156 Sub ~_System_TypeForClass()
157 End Sub
158 Override Function IsClass() As Boolean
159 Return True
160 End Function
161End Class
162
163' インターフェイスを管理するためのクラス
164Class _System_TypeForInterface
165 Inherits TypeBaseImpl
166Public
167End Class
168
169' 列挙体を管理するためのクラス
170Class _System_TypeForEnum
171 Inherits TypeBaseImpl
172Public
173End Class
174
175' デリゲートを管理するためのクラス
176Class _System_TypeForDelegate
177 Inherits TypeBaseImpl
178Public
179End Class
180
181
182'--------------------------------------------------------------------
183' プロセスに存在するすべての型を管理する(シングルトン クラス)
184'--------------------------------------------------------------------
185Class _System_TypeBase
186 pTypes As *TypeInfo
187 count As Long
188
189 Sub _System_TypeBase()
190 pTypes = GC_malloc( 1 )
191 count = 0
192 End Sub
193 Sub ~_System_TypeBase()
194 End Sub
195
196 Sub _add( typeInfo As TypeInfo )
197 pTypes = realloc( pTypes, ( count + 1 ) * SizeOf(*TypeInfo) )
198 pTypes[count] = typeInfo
199 count++
200 End Sub
201
202 ' シングルトン オブジェクト
203 Static obj As _System_TypeBase
204
205Public
206
207 Static Sub Add( typeInfo As TypeInfo )
208 obj._add( typeInfo )
209 End Sub
210
211 Static Sub _NextPointerForGC()
212 ' TODO: 実装
213 End Sub
214
215 Static Sub InitializeValueType()
216 ' 値型の追加
217 obj.Add( New _System_TypeForValueType( "Byte" ) )
218 obj.Add( New _System_TypeForValueType( "SByte" ) )
219 obj.Add( New _System_TypeForValueType( "Word" ) )
220 obj.Add( New _System_TypeForValueType( "Integer" ) )
221 obj.Add( New _System_TypeForValueType( "DWord" ) )
222 obj.Add( New _System_TypeForValueType( "Long" ) )
223 obj.Add( New _System_TypeForValueType( "QWord" ) )
224 obj.Add( New _System_TypeForValueType( "Int64" ) )
225 obj.Add( New _System_TypeForValueType( "Boolean" ) )
226 obj.Add( New _System_TypeForValueType( "Single" ) )
227 obj.Add( New _System_TypeForValueType( "Double" ) )
228 End Sub
229
230 Static Sub InitializeUserTypes()
231 ' このメソッドの実装はコンパイラが自動生成する
232 End Sub
233
234 Static Sub Initialize()
235 ' 値型を初期化
236 InitializeValueType()
237
238 ' Class / Interface / Enum / Delegate を初期化
239 InitializeUserTypes()
240 End Sub
241End Class
242
243' End Namespace ' System
Note: See TracBrowser for help on using the repository browser.