構造函數
????????Vala支持兩種略有不同的構造方案:我們將重點討論Java/C#風格的構造方案,另一種是GObject風格的構造方案。
????????Vala不支持構造函數重載的原因與方法重載不被允許的原因相同,這意味著一個類不能有多個同名構造函數。但這并不構成問題,因為Vala支持命名構造函數。如果您需要提供多個構造函數,可以為它們添加不同的名稱后綴:
public class Button : Object {public Button() {}public Button.with_label(string label) {}public Button.from_stock(string stock_id) {}
}
實例化的方式與之對應:
new Button();
new Button.with_label("點擊我");
new Button.from_stock(Gtk.STOCK_OK);
????????你可以通過this()
或this.``*名稱后綴*
()`實現構造函數鏈式調用:
public class Point : Object {public double x;public double y;public Point(double x, double y) {this.x = x;this.y = y;}public Point.rectangular(double x, double y) {this(x, y);}public Point.polar(double radius, double angle) {this.rectangular(radius * Math.cos(angle), radius * Math.sin(angle));}
}void main() {var p1 = new Point.rectangular(5.7, 1.2);var p2 = new Point.polar(5.7, 1.2);
}
析構函數
????????雖然Vala會自動管理內存,但如果您選擇使用指針進行手動內存管理(后續詳述),或需要釋放其他資源時,可能需要自定義析構函數。語法與C#和C++一致:
class Demo : Object {~Demo() {stdout.printf("in destructor");}
}
????????由于Vala的內存管理基于引用計數而非追蹤式垃圾回收,析構函數的執行是確定性的,可用于實現資源管理的RAII模式(關閉流、數據庫連接等)。