Dart继承和超级构造函数

时间:2013-12-31 15:27:31

标签: inheritance dart super

我正在尝试定义一个抽象的父类Event和一个具体的孩子PlaceChangeEvent

abstract class Event {
    String name;
    DateTime occurredAt;
    int handleCount;

    Event(this.name, this.occurredAt, [this.handleCount = 0]);
}

class PlaceChangeEvent implements Event {
    Place place;

    PlaceChangeEvent(Place place) : super(place.name, DateTime.now());
}

PlaceChangeEvent给了我2个编译器警告:

  • 第一个是类名:Missing inherited members: 'Event.name', 'Event.handleCount' and 'Event.occurredAt'
  • 第二个是对super0 positional arguments expected, but 2 found
  • 的致电

我哪里出错了,我该怎么做才能解决这个问题?我的意图是:

  • 使用name对父级place.name进行硬编码;和
  • 使用当前日期/时间对父级occurredAt属性进行硬编码;和
  • 通过简单地不提供它来将父级的可选handleCount属性初始化为0。

3 个答案:

答案 0 :(得分:3)

您可能希望从Event课程扩展而不是实施它:

class PlaceChangeEvent extends Event {

实现意味着,您的类实现了类的接口,但是没有继承其成员,您需要自己实现它们。您收到有关超级构造函数的警告,因为您仍然从Object而不是Event延伸而Object没有带有两个参数的构造函数。

答案 1 :(得分:2)

在这种情况下,您实现的是您的类而不是扩展它。您的类的实现意味着您的子类必须提供相应的方法。实现意味着您的具体类应该具有这些属性的getter和setter(或者只是自己定义这些属性)。它实际上不会继承类中定义的那些因为你没有扩展Event

答案 2 :(得分:0)

我知道这个问题很老,并且答案很好,应该被接受。所以,这里有一个关于implementsextends之间差异的示例:

import 'dart:math';

abstract class Shape {
  num get area;

  @override String toString() => 'Area is ${this.area}';
}

class Square extends Shape {
  final num side;
  Square({this.side: 2});

  num get area => this.side * this.side;
}

class Circle implements Shape {
  final num radius;
  Circle(this.radius);
  num get area => PI * pow(radius, 2);
}

void main() {
  print(new Square());
  print(new Circle(4));
}

当你运行它时:

dart "./dart-tut/shape.dart"
Area is 4
Instance of 'Circle'