总有时候对目前使用的某些编程语言感到某些不满,于是产生某些想法,记录于此。此后也会记下后续之想法。
空想+理想的编程语言,先看代码,再来解释:
public interface MyInterface ...{
void myMethod();
void homonymicMethod();
}
}
package orz.caikanxp.test ... {
import orz.caikanxp.MyInterface;
public interface YourInterface ...{
void yourMethod();
void homonymicMethod();
}
public class MyClass ...{
private string someClassFiled;
public void classMethod()...{
out.println("Class method invoked.");
}
public void myMethod()...{
out.println("Class myMethod invoked.");
}
public void homonymicMethod()...{
out.println("Class homonymicMethod invoked.");
}
implements MyInterface ...{
void myMethod()...{
out.println("MyInterface myMethod invoked.");
}
void homonymicMethod()...{
out.println("MyInterface homonymicMethod invoked.");
}
}
implements YourInterface ...{
void yourMethod()...{
out.println("YourInterface myMethod invoked.");
}
void homonymicMethod()...{
out.println("YourInterface homonymicMethod invoked.");
}
}
}
public class App ...{
public static void Main(string[] args) ...{
MyClass obj = new MyClass();
// 按照声明类型调用
obj.classMethod(); // 直接调用类方法
obj.myMethod(); // 直接调用类方法
obj.yourMethod(); // 类定义无此方法,通过默认自动类型转换,调用实现的接口方法。
// obj.homonymicMethod(); // 类定义无此方法,实现的接口有多个同名方法,无法确定自动转换的目标类型,编译错误
// 强制转换为接口类型
obj(MyInterface).myMethod(); // 调用实现的接口方法
obj(MyInterface).homonymicMethod(); // 调用实现的接口方法
// 强制转换为接口类型
obj(YourInterface).yourMethod(); // 调用实现的接口方法
obj(YourInterface).homonymicMethod(); // 调用实现的接口方法
// 类型转换的语法的另一种选择?
obj:MyInterface.myMethod();
}
}
}
输出结果:
Class myMethod invoked .
Class homonymicMethod invoked .
MyInterface myMethod invoked .
MyInterface homonymicMethod invoked .
YourInterface myMethod invoked .
YourInterface homonymicMethod invoked .
说明:
1.源文件可以包含多个类定义,通过package块定义类的包(命名空间),借鉴了C#的写法。
2.在同一package中,可以直接访问类。否则需要使用完整类名,或者在源文件中使用import语句导入package名。至于import语句置于何处,对各个package块作何影响,有待进一步考虑。
3.类实现接口的方式,是在类的声明区块内使用implements“接口实现块”。在接口实现块内实现的接口方法可以访问类的私有成员。
4.类实现的接口方法与类自身的方法可以有相同签名,但是含义不同,行为上也可以区别对待。这样可以避免实现的多个方法行为不一致,却是不同接口的同名方法的情况发生。对于实现的接口,必须实现其所有方法,不能因为类自身有相同签名的方法而省去。
5.对于方法的调用,编译期的检查是根据变量的声明类型来查找方法。如果类声明中没有找到合适的方法,则会尝试通过隐式类型转换,调用合适的接口类型的方法;这种情况下必须要求类实现的接口中不会出现多个签名相同的方法。
6.变量声明类型的转换,格式为变量名后加圆括号,括号内跟转换的目标类型。编译器应根据标识符的类型自动判断语句是表示函数调用还是表示类型转换。(或者可以用冒号后跟目标类型的语法?或者其它?……)因为我觉得前置括号式的强制类型转换又难看又麻烦。
以上大部分代码是基于Java的原型,其中3、4、5点,有借鉴并类似于C#中的“显式”声明接口,不过目前我对C#了解不够深入,如有巧合,非常荣幸。