Skip to content

Instantly share code, notes, and snippets.

@ukstudio ukstudio/oop.vim
Created Apr 3, 2009

Embed
What would you like to do?
let s:id_counter = 0
let s:klass = {'_class_': ['Klass'], '_id_': 0}
" クラスの作成
function! s:klass.create(...) dict
let object = deepcopy(self)
let class = copy(self._class_)
for c in get(a:1, '_class_', [])
call add(class, c)
endfor
let s:id_counter += 1
let object._id_ = s:id_counter
call remove(object, 'create')
call extend(object, a:1)
let object._class_ = class
return object
endfunction
" インスタンスの作成
function! s:klass.new(...) dict
let object = deepcopy(self)
let s:id_counter += 1
let object._id_ = s:id_counter
if a:0 >= 1 && !empty(a:1)
call extend(object, a:1)
endif
return object
endfunction
" メソッド一覧
function! s:klass.methods(...) dict
let properties = items(self)
let methods = []
call filter(properties, 'type(v:val[1]) == 2')
for property in properties
let match = matchstr(string(property[1]), 'function')
if !empty(match)
call add(methods, property[0])
endif
endfor
return methods
endfunction
" 継承関係にあるか
function! s:klass.is_a(class) dict
return index(self._class_, a:class) != -1
endfunction
" 継承
function! s:klass.extend(...) dict
let class = copy(self._class_)
call add(class, get(a:1, '_class_', []))
call extend(self, a:1)
let self._class_ = class
let s:id_counter += 1
let self._id_ = s:id_counter
return self
endfunction
function! Test()
" クラス定義
let Person = s:klass.create({
\ '_class_': ['Person'],
\ 'name': '',
\ 'age' : 0})
" メソッド定義
function! Person.hello()
echo "Hello! My name is" self.name
endfunction
let ukstudio = Person.new({'name': 'ukstudio', 'age': 22})
echo ukstudio
call ukstudio.hello()
let tarou = Person.new({'name': 'tarou', 'age': 34})
call tarou.hello()
"メソッドの一覧
echo ukstudio.methods()
"継承する
let Member = Person.extend({'_class_':'Member'})
let member = Member.new({'name': 'member', 'age': 12})
call member.hello()
"継承関係にあるか
echo ukstudio.is_a('Klass')
echo ukstudio.is_a('Person')
echo member.is_a('Person')
" echo s:klass
" echo Person
" echo ukstudio
" echo tarou
" echo Member
" echo member
let Array = s:klass.new({})
" オーバーライド
function! Array.new(...) dict
let i = 0
for v in a:000
let self[i] = v
let i += 1
endfor
return self
endfunction
function! Array.values() dict
let result = {}
let values = items(self)
call filter(values, 'v:val[0] =~ "\\d\\+"')
for value in values
let result[value[0]] = value[1]
endfor
return result
endfunction
let list = Array.new(1, 2, 3, 4)
echo list.values()
endfunction
call Test()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.