2012-04-29 16 views
0

私はLuaで継承を使ってクラスを実装しようとしています。さらに、新しいオブジェクトを作成するときには、ある種の「型チェック」が必要です。Luaで型チェックをしているOOP

一つの特定の要件は、クラス(例)を作成するための特定のシンタックスを使用することである。

Class({Volkswagen, Vehicle, model=String, speed=Number, driving=Boolean}) 

パラメータが可変長のリストとして渡されることに注意してください。

function Class (arguments) 
    name = arguments[1] 
    superclass = arguments[2] 
    ... 
end 

最初の2つの引数がクラスの名前と、それはから継承されたクラスの名前です。だから私は、任意の数の引数を取得する機能を持っている必要があります。

私は解決策は単純であると確信しているが、私は、属性のキーと値のペアを処理するために、どのように絶対にないアイデアを持っていない、例えば...

print(arguments.model) 
print(type(arguments.model)) 

は...両方ともゼロです。どのように私は属性の種類(文字列、ブール値、数値)を得ることができる任意のアイデア?

答えて

3

このライン:

{Volkswagen, Vehicle, model=String, speed=Number, driving=Boolean} 

は、あなたがそれが意味考えるものを意味するものではありません。それは値です。

{Volkswagen}を実行しているときに、現在グローバルテーブルに格納されている値のうち、現在のところLuaに文字列名"Volkswagen"が格納されていることを伝えます。私はそこにいくつかの価値が保存されていると仮定します。

{model=String}は、グローバルテーブルに現在格納されている値を文字列名"String"にテーブルに格納しているという問題があります。オッズは良いです。は、"String"という名前のグローバル変数です。つまり、nilをテーブルに入れます。

LuaJavaがそれらを定義しない限り、「属性」(String、Boolean、Number)は存在しません。それらは単に空の値です。空の値を渡すことはできません。 文字列を渡すことができますが、それは異なっています。

このClassの機能がどういうものなのかよく説明していないので、自分のやり方をヒントできません。

0

あなただけの一般的なLuaのクラスのシステムを探しているなら、ここに私の実装です:それは型チェックをサポートしていません https://gist.github.com/1722329

が、それは簡単として機能する「TypedClass」クラスで実装する必要がありますすべての厳密に型指定されたクラスのベースです。

0

キーと値のペアを処理するために、あなたは使用してローカルテーブルに参照されるテーブルを転送する必要があるかもしれ表関数に建て:

function Class(params) 
local arguments={} 

function transfer(k, v) 
    arguments[k]=v 
end 

--transfer referenced table to local table 
table.foreach (params, transfer) 

print(arguments[1]) 
print(arguments[2]) 
print(arguments.model) 
print(arguments.speed) 
print(arguments.driving) 

エンド

クラス({「フォルクスワーゲン」、「車両"、model =" "、speed = 0、driving = false})

関連する問題