總有時候對目前使用的某些編程語言感到某些不滿,於是產生某些想法,記錄於此。此後也會記下後續之想法。
空想+理想的編程語言,先看代碼,再來解釋:
package orz.caikanxp {
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 method invoked.
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#瞭解不夠深入,如有巧合,非常榮幸。