Dart 为什么可以';当重写==运算符时,我是否使用相等规则? void main()=>Foo()==1; 福班{ @凌驾 布尔运算符==(对象其他){ 打印(super==此);//true //打印(this==super);//编译错误 返回super==其他; } }

Dart 为什么可以';当重写==运算符时,我是否使用相等规则? void main()=>Foo()==1; 福班{ @凌驾 布尔运算符==(对象其他){ 打印(super==此);//true //打印(this==super);//编译错误 返回super==其他; } },dart,Dart,有两个问题 为什么我不能做这个==super 如果查看return语句return super==other,您可以知道操作符=是在对象类上调用的,那么整个=实现是否不是已委托给对象类的调用 如果第二个问题不清楚,让我进一步解释。比如说我查了一下 Foo()==1 在Foo类中定义的=操作符将被调用,我所做的就是返回super==other,这意味着对象的=操作符正在被调用,other是int,那么上面代码中的Foo实例在哪里呢?这里,它只是Object和int。我认为super也在做其他

有两个问题

  • 为什么我不能做这个==super

  • 如果查看return语句
    return super==other
    ,您可以知道操作符
    =
    是在
    对象
    类上调用的,那么整个
    =
    实现是否不是已委托给
    对象
    类的调用

  • 如果第二个问题不清楚,让我进一步解释。比如说我查了一下

    Foo()==1
    

    Foo
    类中定义的
    =
    操作符将被调用,我所做的就是返回
    super==other
    ,这意味着
    对象的
    =
    操作符正在被调用,
    other
    int
    ,那么上面代码中的
    Foo
    实例在哪里呢?这里,它只是
    Object
    int
    。我认为
    super
    也在做其他事情,不确定是什么。

    回答您的问题:

  • 您不能执行
    this==super
    ,因为
    super
    不是一个表达式,如果您尝试运行该程序,就会得到解释(分析的表达式可能会给出更好的解释):

    bin/stackoverflow.dart:7:19:错误:无法将“super”用作表达式。
    要将构造函数委托给超级构造函数,请将超级调用作为初始值设定项。
    打印(this==super);//编译错误
    ^^^^^
    
    这也是有意义的,因为
    super
    不是一个对象。这是一个概念,我们可以用来指定是否要引用被重写的字段/方法。但是我们不能使用
    super
    作为某种对象,因为我们的对象不是层中的多个对象,在这些层中,您可以提取一个层,然后将其表示为另一个对象。相反,我们的对象是一个基于如何定义类的组合实现

  • 是的,当您
    返回super==other
    时,您基本上是在调用
    对象的
    ==
    操作符

  • 补充示例:

    但是请记住,我们只是调用
    对象中定义的
    ==
    操作符。我们的目标仍然是一个组合数据结构,可以通过以下示例进行说明:

    class A {
      final int a = 5;
    
      int getA() => a;
    }
    
    class B extends A {
      int get a => 10;
    
      int getA() {
        return super.getA();
      }
    }
    
    void main() {
      print(B().getA()); // 10
    }
    

    您可以看到,即使我们调用
    super.getA()
    ,我们仍然在一个
    B
    对象上运行,我们已经覆盖了
    a
    字段,但是我们调用了
    a.getA()
    方法。

    谢谢。除了第一个问题外,几乎所有的疑问都很清楚。正如你提到的“既然super不是一个对象”,当我们做
    super==
    ,它实际上不是一个
    super.=
    ?-
    super
    然后变成了一个对象。如果我理解正确,你基本上说的是在做
    super==other
    ,我们实际上在调用
    Foo
    =
    操作符,对吗?不,我们使用
    super
    指向我们扩展的类中声明的方法(在本例中为
    Object
    )。它只是一种语法,因为
    super
    没有解析为任何内容(这就是为什么不能将其用作表达式的原因)因此,如果我们在
    Object
    上调用
    ==
    操作符,那么在执行
    Foo()时,
    Foo
    实例在
    Foo
    =
    操作符实现中被引用/使用/提及==1
    。我们不仅仅是将
    对象
    int
    进行比较吗?我的英语不是很好,但我希望我能对您有所帮助。@iDecode这里记录了
    对象
    中的
    =
    运算符:。简而言之,它只是检查我们谈论的对象实例是否完全相同。在您的情况下,您是只需从
    对象
    调用
    ==
    操作符,这与没有覆盖
    =
    操作符的情况相同。