Eiffel 中的不可变类

2024-03-15

我正在尝试做一个不可变的POINT在埃菲尔铁塔上课。下面的代码定义了一个吗?这{NONE}的可访问性x and y田地就够了吗?我可以给类不变量写一些东西吗x = x',或者我还能如何实现不变性?

class POINT
    create
        make
    feature {NONE}
        x: DOUBLE
        y: DOUBLE
    feature
        make (x_: DOUBLE; y_: DOUBLE)
        do
            x := x_
            y := y_
        ensure
            set: x = x_ and y = y_
        end

    feature --accessors
        get_x: DOUBLE
        do
            Result := x
        ensure
            Result = x
        end
    end

Eiffel 不允许其客户端更改类的属性。例如,以下代码被拒绝:

p: POINT
...
p.x := 5.0

因此,不需要提供 getter(就像在其他一些语言中一样)。你可以只使用p.x前提是x已充分导出到客户端类。因此,您的示例的代码可以简化为

class POINT
create
   make
feature -- Access
   x: DOUBLE
   y: DOUBLE
feature {NONE} -- Creation
   make (x0: DOUBLE; y0: DOUBLE)
      -- Initialize object with `x0' and `y0'.
   do
      x := x0
      y := y0
   ensure
      set: x = x0 and y = y0
   end
end

注意创建过程是not不再导出,否则可以将其用作正常(即非创建)例程并更改属性,也就是说,我们可以执行以下操作

create p.make (1, 1)
p.make (2, 3)
print (p)

这会打印(2, 3),即您将能够更改原始对象的值p,使其可变。

虽然现在不能直接更改属性,但仍然可以调用功能copy在类型的对象上POINT并改变整个对象。如果你也想避免这种情况,可以在类中重新定义该功能POINT引发异常,甚至有后置条件False导致运行时为您引发异常:

copy (other: like Current)
      -- <Precursor>
   do
      (create {EXCEPTIONS}).raise ("Attempt to change an immutable object.")
   ensure then
      is_allowed: False
   end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Eiffel 中的不可变类 的相关文章

  • 从 3 个点检索正角或负角

    我正在围绕二维空间中的中心点旋转点 这些点是中心点 旧鼠标位置和新鼠标位置 我的旋转功能运行良好 我可以完美地计算角度 但如果用户沿应解释为逆时针方向移动鼠标 我想计算负角度 例如 如果您位于 小于 中心点的 y 值之上 小于 则向右 正
  • .NET ORM、不可变值对象、结构、默认构造函数和只读属性

    我刚刚开始使用 NET ORM 甚至还没有在 Entity Framework 和 NHibernate 之间做出决定 但在这两种情况下 我都遇到了一个问题 因为他们似乎希望我以各种方式损害域模型的完整性 特别是在 C 对象设计的更精细的方
  • 不可变对象的真正好处是什么

    我总是听到人们说 在使用多个线程时管理不可变对象更容易 因为当一个线程访问不可变对象时 不必担心另一个线程正在更改它 那么 如果我有一个公司所有员工的不可变列表并且雇用了一名新员工 会发生什么情况 在这种情况下 必须复制不可变列表 并且它的
  • 在 .NET 中表示不可变列表的最佳方式是什么?

    我最近开始使用 F 进行 实际工作 并重新发现了不可变数据结构的美妙之处 例如 F 中的可区分联合和记录 我还发现它们在 C 中使用起来非常简单 特别是因为它们不需要对 F 运行时有任何直接依赖 然而 当涉及到在这些结构中表示列表时 我还没
  • 使用 GeoPandas 将点几何图形转换为线串

    我有一个地理数据框gdf看起来像这样 longitude latitude geometry 8628 4 890683 52 372383 POINT 4 89068 52 37238 8629 4 890500 52 371433 PO
  • .NET 中可以使用不可变数组吗?

    是否有可能以某种方式标记System Array作为不可变的 当放在 public get private set 后面时 它们无法添加到其中 因为它需要重新分配和重新分配 但消费者仍然可以设置他们希望的任何下标 public class
  • 可变值和不可变值重定义有什么区别?

    我读到 F 中的值是不可变的 然而 我也遇到了重新定义价值定义的概念 它掩盖了以前的定义 这与可变值有何不同 我问这不仅是一个理论构造 而且还询问是否有关于何时使用可变值以及何时重新定义表达式的建议 或者如果有人可以指出后者不是惯用的 f
  • 在 Objective C 中定义不可变类的最佳方法

    我是 Objective C 的新手 我想知道什么是 在 Objective C 中定义不可变类的最佳方式 例如 NSString 我想知道要使类不可变必须遵循哪些基本规则 我觉得 不应提供设置器 如果使用属性 它们应该是只读的 要 禁用
  • Eiffel 中的不可变类

    我正在尝试做一个不可变的POINT在埃菲尔铁塔上课 下面的代码定义了一个吗 这 NONE 的可访问性x and y田地就够了吗 我可以给类不变量写一些东西吗x x 或者我还能如何实现不变性 class POINT create make f
  • Python 中的元组声明

    在 python 中 可以用括号显式声明一个元组 如下所示 gt gt gt x 0 25 0 25 0 25 0 25 gt gt gt x 0 25 0 25 0 25 0 25 gt gt gt type x
  • 协变类型 T 发生在不变位置

    我正在 Scala 中迈出第一步 我想让以下代码起作用 trait Gene T val gene Array T 编译器给出的错误是 covariant type T occurs in invariant position in typ
  • 声明 C++ 不可变类的惯用方式

    所以我有一些相当广泛的功能代码 其中主要数据类型是不可变的结构 类 我声明不变性的方式是通过将成员变量和任何方法设置为 const 来 实际上是不可变的 struct RockSolid const float x const float
  • 是否可以在 Windows Phone 7/8 上使用 protobuf-net 序列化/反序列化不可变类型?

    是否可以在 Windows Phone 7 8 上使用 protobuf net 序列化 反序列化类型 我尝试了下面的代码 似乎不支持构造函数跳过 即 UseConstructor false 因此我创建了一个无参数构造函数 但反序列化失败
  • 为什么基元的包装类没有 setter?

    包装类 如 Integer Double 等 没有为其内部原始值设置 setter 的原因是什么 我问这个问题是因为这种功能可以简化微积分 并使 Java 语言更加灵活 让我举一些例子 1 我们看下面的例子 Integer x new In
  • 星系模拟:更改点的颜色并在鼠标悬停时显示文本

    我正在尝试创建模拟 https riteshsingh github io galaxies 4673 个最近星系的位置 星系是点 我想为鼠标悬停时的点着色并加载星系的名称 我花了很多天试图实现它 我可以更改颜色以及进行基本的光线投射 但是
  • 为什么 JavaScript 中的数字是不可变的?

    我在这里阅读了问题和答案 javascript 数字 不可变 https stackoverflow com questions 8248568 javascript numbers immutable 但我还不清楚为什么数字 原始类型 是
  • Python 字符串不是不可变的吗?那为什么a + " " + b 会起作用呢?

    我的理解是 Python 字符串是不可变的 我尝试了以下代码 a Dog b eats c treats print a b c Dog eats treats print a b c Dog eats treats print a Dog
  • Java 不可变类规则

    下面的类是不可变的吗 final class MyClass private final int array public MyClass int array this array array 不 这不是因为数组的元素仍然可以更改 int
  • 如何在JavaScript中计算3点之间的角度? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想在 JavaScript 中获取 3 点之间的角度 如果我有积分A x1 y1 B x2 y2 and C x3 y3 我想得到由线A
  • Python:我可以修改元组吗?

    我有一个 2 D 元组 实际上我以为 它是一个列表 但错误说它是一个元组 但无论如何 该元组的形式为 浮点数 val prod id 现在我有一个字典 其中包含 key gt prod id 和 value prod name 现在 我想将

随机推荐

  • 如何使用 Pandas txt 文件读取每行中的列名

    我是Python初学者 我需要读取一个txt文件 其中每一行都有列名 列是无序的 并且并非所有列都被告知 有没有办法用 Pandas 读取这种文件 这是一个示例 3 行 email protected cdn cgi l email pro
  • 使用 JavaScript 反转添加到 DOM 的元素的顺序

    我正在用 JavaScript 制作游戏 需要事件日志 如果我攻击 它会告诉我是否击中或未击中 这是我的代码 function eventlogshow text var para document createElement p var
  • R中的并行I/O从磁盘读取文件

    我碰巧在 R 中需要读取和处理大量文件 20000 个文件 总共 40gb 我正在考虑并行读取 然而 我想到了一个关于并行化的哲学问题 也许问题是错误的 我的措辞不正确 因为我不是该主题的专家 所以请纠正我的错误 即使使用并行化 磁盘读取器
  • 创建 Python .exe 文件:py2exe 无效图像错误

    我想创建一个 exe文件 我使用 Python 2 7 3 和 wxPython 作为 GUI 我已经安装了py2exe对于Python 2 7并尝试创建一个 exe按照教程创建文件http www py2exe org index cgi
  • 使用 C# 和 XAML 在 Windows 应用商店应用程序中绑定资源文件值字符串

    我有资源文件 Strings en US Resources resw 我正在尝试绑定到该文件中的字符串 如下所示
  • 是否可以在 MAILTO 链接的正文中添加 HTML 链接[重复]

    这个问题在这里已经有答案了 我不必过多地处理 mailto 链接 但是 如果可能的话 我现在需要在邮件正文中添加一个链接 有没有办法添加链接或将打开的电子邮件更改为 html 电子邮件与文本电子邮件 就像是 a href Link text
  • 实体框架 V4:“仅代码”性能注意事项

    我即将开始一个新项目 想知道 仅代码 是否是正确的方法 我们还考虑通过设计器使用其他模型优先方法 但宁愿在 EF 设计器之外设计我的域模型 我们的域可能包含 100 多个实体 我读到大量实体可能会在一定程度上减慢 EF 的速度 即 创建上下
  • 从第 1 列中取出最小值的整行

    我有这个文件 2 1 12 2 34 1 56 1 45 3 33 2 77 1 83 2 62 3 75 3 我想像这样从第 1 列中取出最小值的整行 2 1 12 2 45 3 首先是这里 if vals 2 vals 2 gt 1 v
  • 原则 2 优先于多对一关联

    是否可以覆盖 ManyToOne targetEntity I read 这个学说文档页面 http docs doctrine project org projects doctrine orm en latest tutorials o
  • @Value -> 无法将类型“java.lang.String”的值转换为所需类型“java.lang.Integer”

    美好的一天 我正在使用 Spring 4 1 1 RELEASE 开发一个 Web 应用程序 所有 Spring 配置都是通过注释完成的 除了一件事之外它工作正常 我的项目中有一个 config properties 文件 其中包含这些行
  • 如何从 node-webkit 应用程序打开浏览器窗口?

    我有一个桌面应用程序 使用 node webkit 打包 我需要通过单击链接打开用户的默认浏览器 我在用 window open www google com 但这会打开一个新的 node webkit 窗口 而不是打开浏览器窗口 我如何打
  • JSF 视图 - 在操作上返回 null 不会更新视图

    我读过与我有同样问题的帖子JSF ViewScope 在不更新视图的操作上返回 null https stackoverflow com questions 13914594 jsf viewscope returning null on
  • UWP:PRI277:0xdef00532 - 资源“”的值冲突

    作为 Visual Studio 2017 UWP 生成过程的一部分 会运行一个名为 MakePri exe 的应用 它在我的项目中引发错误 但我不知道为什么 命令行调用是 C Program Files x86 Windows 套件 10
  • 打印文件中一行的最后一列

    我有一个不断被写入 更新的文件 我想找到包含特定单词的最后一行 然后打印该行的最后一列 该文件看起来像这样 随着时间的推移 将会添加更多 A1 B1 C1 行 A1 123 456 B1 234 567 C1 345 678 A1 098
  • Java 中的内存 OLAP 引擎 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有内存中 OLAP 切片和切块数据 Java 库 相当于 Microsoft 分析服务 特别想听听
  • 修复了页眉与页内锚点重叠的问题

    如果我在 HTML 页面中有一个非滚动标题 固定在顶部 具有定义的高度 有没有办法使用 URL 锚点 fragment部分 让浏览器滚动到页面中的某个点 但仍然尊重固定元素的高度无需 JavaScript 的帮助 http example
  • 无法在 yum 上下载 caddy 包

    我在 Amazon Linux 上使用 AWS EC2 当我尝试下载 caddy yum install caddy 时 出现以下错误 如屏幕截图所示 编辑 2022 年 11 月 19 日 A H 的回答 https stackoverf
  • 找不到所需的文件index.html - Heroku 推送错误

    我正在使用 Heroku CLI 将 React Node 应用程序推送到 Heroku 构建失败 错误为找不到所需的文件index html 我已经检查了所有文件和一切就位 不知道我错过了什么 我被困在这里一星期了 请帮我 我正在使用 H
  • 如何在搜索之前编辑 jQuery 自动完成的输入?

    我有一个自动完成框 出于本示例的目的 因为它是一个简单的示例 返回一个包含社会安全号码的列表 为了便于阅读 它们中有破折号 我想修改自动完成功能 以便如果我输入 123456789 或 123 45 6789 它将在自动完成功能中找到相同的
  • Eiffel 中的不可变类

    我正在尝试做一个不可变的POINT在埃菲尔铁塔上课 下面的代码定义了一个吗 这 NONE 的可访问性x and y田地就够了吗 我可以给类不变量写一些东西吗x x 或者我还能如何实现不变性 class POINT create make f