2011-10-25 7 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の最終的なキーワードに直接相当するものはありません。私はこのような何かあなたが来ることができるようになるだろうされている最も近いと思う:

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

関連する問題