【问题标题】:How to override nullable field with non-nullable one dart如何用不可为空的一个飞镖覆盖可空字段
【发布时间】:2021-07-18 03:14:46
【问题描述】:

我有一个具有可为空属性的类。我想创建一个超类,用不可为空的属性覆盖该属性

所以

class Example {
String? name;
}

class NamedExample extends Example {
@override
String name;

}

有没有办法做到这一点?如果不是,通常如何实现这个目标。

我基本上想要两个相同的类,除了一个总是有一个属性,而另一个是可选的。

【问题讨论】:

    标签: dart inheritance dart-null-safety


    【解决方案1】:

    这是covariant 关键字的位置。通常用子类型覆盖参数的类型是没有意义的,这样做是无效的。这个关键字告诉分析器这是故意的。它可以添加到超类或子类中。

    子类:

    class Example {
      String? name;
    }
    
    class NamedExample extends Example {
      @override
      covariant String name;
      
      NamedExample(this.name);
    }
    

    超类:

    class Example {
      covariant String? name;
    }
    
    class NamedExample extends Example {
      @override
      String name;
      
      NamedExample(this.name);
    }
    

    【讨论】:

      【解决方案2】:

      您不能用String name 覆盖String? name 成员的原因是它可能违反基类中setter 的约定,因此可能不安全。基类宣传:

      var example = Example();
      example.name = null;
      

      是合法的。但是,如果 exampleNamedExample 的一个实例,则 example.name = null 分配将不再合法。 covariant 关键字禁用此安全检查并相信您在实践中永远不会执行此类分配。

      一般来说,你应该avoid overriding fields

      如果您的类仅公开一个 getter,您可以安全地进行覆盖。以下两个示例都是合法且安全的:

      class Example {
        String? _optionalName;
        String? get name => _optionalName;
      }
      
      class NamedExample extends Example {
        NamedExample(this._requiredName);
      
        String _requiredName;
      
        @override
        String get name => _requiredName;
      }
      

      class Example {
        Example([this.name]);
      
        final String? name;
      }
      
      class NamedExample extends Example {
        NamedExample(this.name);
      
        @override
        final String name;
      }
      

      【讨论】:

      • 哦。我没有查找协变关键字。我认为它是专门用于覆盖不同类型的。我没有意识到它在每种情况下都允许不同的任务。我不想要那个。这是一个更好的解决方案。谢谢
      • 哦。刚刚阅读它。它专门用于覆盖子类型。我想我误解了你在说什么。不过,您的解决方案似乎仍然是更好的方法
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-04
      • 1970-01-01
      • 2022-12-15
      • 1970-01-01
      • 2019-11-11
      • 2019-03-17
      • 1970-01-01
      相关资源
      最近更新 更多