2011-10-25 27 views
1

過去幾天我一直在研究Vala編程語言,它看起來很有希望。然而,我無法弄清楚如何在對象構造中正確地分配一個常量(現在的Vala相當於final)。例如,在Java中:Vala - 對象構造函數中的常量初始化和賦值

import java.lang.Math; 

public class Rectangle { 
    public final double sideA; 
    public final double sideB; 
    public final double area; 
    public final double diagonal; 

    public Rectangle (double SideA, double SideB) { 
     sideA = SideA; 
     sideB = SideB; 
     area = SideA * SideB; 
     diagonal = Math.sqrt(Math.pow(SideA, 2) + Math.pow(SideB, 2)); 
    } 
} 

這將如何寫入Vala?

回答

1

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))); 
    } 
} 
+0

完美!這看起來**很多**比我目前的設置更好。謝謝! – terrygarcia

相關問題