我正在为自己的目的设计一种语言。它基本上有两个实体,功能和类型。 e.g。
Object1 = CreateObject1("param1", "param2", 23 ) //Line 1
Object3 = Object1 + Object2 //Line 2
Evaluate(Object3) //Line 3
第2行评估Object1类型的对象是否为Object2的“+”,如果是,则创建结果对象并将其分配给Object3。变量定义类似于Java Script中的var关键字。
我脑海中的设计就像创建一个基础“Value”类(具有加,减,乘,除等原始操作),具有具体的子项,每个子项对应于我计划用该语言摄取的不同类型。
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 :(得分: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;
}
}