2011-02-15 28 views
1

我正在爲我自己的目的設計一種語言。它基本上有兩個實體,功能和類型。例如用於設計語言類型系統的正確的類設計

Object1 = CreateObject1("param1", "param2", 23) //Line 1 
Object3 = Object1 + Object2 //Line 2 
Evaluate(Object3) //Line 3 

第2行的計算結果,如果類型的對象Object1是「+」至Object2的,並且如果然後所得對象將被創建並且是將被分配到Object3。變量定義就像Java腳本中的var關鍵字。

我腦海中的設計就像創建一個基本的「價值」類(具有像加,減,乘,除等基本操作)具有具體的孩子,每個孩子對應我計劃用語言攝入的不同類型。

class Value{ 
Value add(Value value) 
.. 
} 

class Integer extends Value{ 
Value add(Value value){ 
    //if value is compatible to add with Integer type then return the appropriate  
    //resultant object else throw exception. 
} 
} 

我可以輕鬆地創建孩子類這樣的,但如果一個函數變化的對象的屬性(如一個部件值被改變的類的),然後我需要向下轉換到它於該類型,更新相應的屬性。

class ABC extends Value{ 
Value add(Value value){ 
// 
} 

private int X; 
private int Y; 
private int Z; 
private string XYZ; 

public setX(int x){ 
    this.X = x; 
} 
. 
. 
} 

ObjectABC = GetABC(); 
SetX(ObjectABC, 1) 

在函數SetX()的實現中。我會做這樣的事情:

ABC abc = (ABC)ObjectABC; //ObjectABC will be a Value type here. 
abc.setX(1); 

我想擺脫這倒下來鑄造的東西。可以做到嗎?請指教。

+0

通常有辦法消除鑄造,但我認爲你需要提供正是你在做什麼的更多信息。例如,誰定義了ABC對象?這是用你的語言定義還是用Java定義的?至少,試着用你的語言展示一個完整的示例程序。 – 2011-04-02 01:24:00

回答

0

你可以使用雙調度像這樣:

abstract class Value { 
    Value add(Value v) { throw new InvalidArgumentException("add", getClass(), v); } 
    Value addInteger(Integer i); 

    Value divide(Value) { throw new InvalidArgumentException("divide", getClass(), v); } 
    Value divideIntegerReversed(Integer i); 

} 

class Integer extends Value { 
    @Override 
    Value add(Value v) { 
    return v.addInteger(this); 
    } 

    @Override  
    Value addInteger(Integer other) { 
     // note the argument reversal but not worries because addition is commutative 
     return whtvr; 
    } 

    @Override 
    Value divide(Value v) { 
    return v.divideIntegerReversed(this); 
    } 

    @Override 
    Value divideIntegerReversed(Integer nom) { 
    // note that we now want `nom/this` and not `this/nom` 
    return wthvr; 
    } 
}