1

ここ数日、Vala プログラミング言語を検討してきましたが、有望そうに見えます。finalただし、オブジェクトの構築で定数 (現在は に相当する Vala) を適切に割り当てる方法がわかりません。たとえば、Java では次のようになります。

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でどのように書かれますか?

4

1 に答える 1

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構築がどのように機能するかにより、finalとは少し異なります。これらは構築時にのみ設定できますが、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)));
  }
}
于 2011-10-25T22:02:06.727 に答える