【问题标题】:Some mistakes in the language语言上的一些错误
【发布时间】:2019-09-04 07:36:44
【问题描述】:

我是 Dart 的新手,我想明确这一点。我在 Dart 中创建了两个类,一个是“Person”,另一个是第一个的子类,它被命名为“Employee”。 我创建了一个人的对象。当我将此对象更改为 Employee 类的实例时,没有错。但是当我询问 Employee 内部的参数时,我提出了一个错误。

那么为什么 Dart 允许我访问对象的类,却不允许我访问新类内部的参数?

下面的代码:

void main {
var person = Person(name: "Zozor");
  print(person.describe());
  person = Employee(taxCode: 'AAB');
  person.sayName();
  print(person.taxCode);
}

class Person {
  Person({this.name, this.age, this.height});
  String name;
  final int age;
  final double height;
  String describe() => "Hello, I'm ${this.name}. I'm ${this.age} and I'm ${this.height} meter${this.height == 1 ? '':'s'} tall";
  void sayName()=> print("Hello, I'm ${this.name}.");
}

class Employee extends Person {
  Employee({String name, int age, double height, this.taxCode, this.salary}) : super(name:name, age: age, height: height);
  final String taxCode;
  final int salary;
}

【问题讨论】:

    标签: dart


    【解决方案1】:

    Dart 中的变量必须在使用前声明。它们有一个类型并存储对该值的引用(请参阅https://www.tutorialspoint.com/dart_programming/dart_programming_variables.htm)。

    var person = Person(name: "Zozor");
    

    声明 Person 类型的变量 person(类型派生自它被初始化的类的类型)。

    当你分配时:

    person = Employee(taxCode: 'AAB');
    

    类型在赋值时没有改变(即仍然是 Person),只有将 Employee 向下转换为 Person 的结果的引用发生了变化(向下转换是隐式完成的,如 https://news.dartlang.org/2012/05/types-and-casting-in-dart.html 所述)。

    以上是由于 var 创建了静态类型变量。 另一种方法是使用动态类型,如下所示:

    dynamic person = Person(name: "Zozor");
    

    这声明了一个类型为动态的人员变量。现在当分配给员工时:

    person = Employee(taxCode: 'AAB');
    

    person 变量的类型现在是 Employee 而不是 Person。此外,没有 Employee 的向下转换,也没有与 taxCode 相关的错误消息。

    保持静态(而不是使用动态)的简单方法是使用将人员显式重铸为员工:

    print((person as Employee).taxCode);
    

    这会将一个人转换为 Employee,然后获取 taxCode。

    【讨论】:

    • 好的,我明白了。在 Dart 中,与您为变量指定动态不同,对象的类永远不会改变。
    • 正确。 Dart 静态类型提供编译器和 IDE 编码优势,例如 hackernoon.com/…
    • 但是如果我们向下转换一个对象,如果你不能使用向下转换的类方法或属性,它的目的是什么。哼,我觉得 'dynamic' 关键字太重了,不能简单地向下转换一个对象。
    • @Charles-LéviBRIANI 我相信我在更新的答案中解决了这个问题。基本上你可以通过重铸获得访问权限,即 (person As Employee).taxCode
    • 谢谢!这个“as”关键字是一种更好的方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-27
    • 2011-04-15
    相关资源
    最近更新 更多