Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Variables Vala-对象构造函数中的常量初始化和赋值_Variables_Constructor_Constants_Vala - Fatal编程技术网

Variables Vala-对象构造函数中的常量初始化和赋值

Variables Vala-对象构造函数中的常量初始化和赋值,variables,constructor,constants,vala,Variables,Constructor,Constants,Vala,在过去的几天里,我一直在研究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 dia

在过去的几天里,我一直在研究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));
    }
}

这将如何用Vala编写?

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)));
  }
}
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)));
  }
}
构造属性与final有点不同,这主要是因为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; }
  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)));
  }
}
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)));
  }
}

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)));
  }
}
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)));
  }
}
构造属性与final有点不同,这主要是因为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; }
  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)));
  }
}
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)));
  }
}
完美的这看起来比我目前的设置好多了。谢谢完美的这看起来比我目前的设置好多了。谢谢