Vala沒有直接等價於Java的final關鍵字。我想你要能來最接近的是這樣的:
public class Rectangle : GLib.Object {
public double sideA { get; construct; }
public double sideB { get; construct; }
public double area { get; construct; }
public double diagonal { get; construct; }
public Rectangle (double SideA, double SideB) {
GLib.Object (
sideA: SideA,
sideB: SideB,
area: SideA * SideB,
diagonal: Math.sqrt(Math.pow(SideA, 2) + Math.pow(SideB, 2)));
}
}
結構特性是因爲建設如何GObject的作品主要來自最後一個有點不同。它們只能在構建時設置,但不像Java中的final(IIRC ...我的大部分Java知識已被壓制),它們也可以在構建子類時進行設置。例如,這是完全可以接受的:
public class Square : Rectangle {
public Square (double Side) {
GLib.Object (
sideA: Side,
sideB: Side,
area: Side * Side,
diagonal: Math.sqrt(Math.pow(Side, 2) + Math.pow(Side, 2)));
}
}
所以,如果你想允許的GObject風格的建築(這我會建議你做,如果你正在一個庫中的其他人會打電話......如果代碼只爲你沒有必要),你可能想要做更像這樣的事情:
public class Rectangle : GLib.Object {
public double sideA { get; construct; }
public double sideB { get; construct; }
private double? _area = null;
public double area {
get {
if (_area == null)
_area = sideA * sideB;
return _area;
}
}
private double? _diagonal = null;
public double diagonal {
get {
if (_diagonal == null)
_diagonal = Math.sqrt(Math.pow(sideA, 2) + Math.pow(sideB, 2));
return _diagonal;
}
}
public Rectangle (double SideA, double SideB) {
GLib.Object (
sideA: SideA,
sideB: SideB,
area: SideA * SideB,
diagonal: Math.sqrt(Math.pow(SideA, 2) + Math.pow(SideB, 2)));
}
}
完美!這看起來**很多**比我目前的設置更好。謝謝! – terrygarcia