Vala - Инициализация и назначение констант в конструкторе объектов - PullRequest
1 голос
/ 26 октября 2011

Последние несколько дней я смотрел на язык программирования Vala, и он выглядит многообещающе. Однако я не могу понять, как правильно назначить константу (в настоящее время Vala эквивалент final) при построении объекта. Например, в 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));
    }
}

Как бы это было написано на Вала?

1 Ответ

1 голос
/ 26 октября 2011

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.Они могут быть установлены только во время создания, но в отличие от final в Java (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)));
  }
}
...