【问题标题】:Vala - Constant Initialization and Assignment in Object ConstructorVala - 对象构造函数中的常量初始化和赋值
【发布时间】:2011-10-25 20:26:56
【问题描述】:

过去几天我一直在研究 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 会怎么写?

【问题讨论】:

    标签: variables constructor constants 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)));
      }
    }
    

    construct 属性与 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; }
    
      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)));
      }
    }
    

    【讨论】:

    • 完美!这看起来比我目前的设置好多。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-05
    • 1970-01-01
    • 2013-05-23
    • 2013-01-12
    • 2021-11-06
    • 1970-01-01
    相关资源
    最近更新 更多