Dart中的抽象基类

23

我已经使用Java编程将近两年,但现在更多地转向Web编程,因此是Javascript,或者在我的情况下是Dart。对于我正在工作的项目,我想要抽象基类,就像在Java中一样。我在互联网上寻找了一下,但是我找不到有关Dart抽象类的任何信息。我只找到了这篇来自dart lang网站的文章,介绍了在一个示例中使用抽象关键字的类。 但我真的不理解混入原则。

是否有人可以将这个简单的Java抽象基类示例翻译成Dart,以便我可以基本了解如何在Dart中进行操作?该示例涵盖了抽象基类(当然,包括抽象方法),多态对象强制转换方法重载(在这种情况下是构造函数),调用超级构造函数调用超载自身构造函数

// Abstract base class
abstract class Vehicle {
    protected final int maxSpeed;
    protected int speed;
    
    Vehicle() {
        this(0);
    }
    
    Vehicle(int maxSpeed) {
        this.maxSpeed = maxSpeed;
        speed = 0;
    }
    
    public int getMaxSpeed() {
        return maxSpeed;
    }
    
    abstract void accelerate();
    abstract void brake();
}

// Subclass of Vehicle, the abstract baseclass
class Car extends Vehicle {
    public final int doors;
    
    Car(int maxSpeed, int doors) {
        super(maxSpeed);
        this.doors = doors;
    }
    
    @Override
    void accelerate() {
        if (speed>maxSpeed) {
            speed = maxSpeed;
            return;
        }
        speed += 2;
    }

    @Override
    void brake() {
        if (speed - 2 < 0) {
            speed = 0;
            return;
        }
        this.speed -= 2;
    }
}

那么这种简单的实现会是什么样子呢?

// Polymorphism
Vehicle car = new Car(180, 4);

// Casting
int doors = ((Car)car).doors;

// Calling abstract method
car.accelerate();
2个回答

45
我会看一下语言指南中关于抽象类的整个部分。
要点如下:
- 在Dart中,抽象类必须标记为“abstract”。 - 抽象类可以有“抽象方法”,只需省略方法体即可。 - 具体类可以使用关键字“implements”将自己标记为实现抽象类的协议。这将强制您在具体类上实现所有预期的行为,但它不会继承抽象类提供的方法实现。 - 您可以使用关键字“extends”扩展抽象类,具体类将继承抽象类的所有可能行为。 - 就是这样!
此外,您可能还想看一下混入(mixins),在我给你的语言指南下面有一个部分。

Dart 中有抽象属性吗? - Faizan Mubasher
“省略主体”起了作用!谢谢。 - gvNN

35

实际上,在dart中确实变得更简单了(https://dartpad.dartlang.org/37d12fa77834c1d8a172)

// Abstract base class
abstract class Vehicle {
  final int maxSpeed;
  int speed = 0;

  Vehicle([this.maxSpeed = 0]);

  void accelerate();
  void brake();
}

// Subclass of Vehicle, the abstract baseclass
class Car extends Vehicle {
  final int doors;

  Car(int maxSpeed, this.doors) : super(maxSpeed);

  @override
  void accelerate() {
    if (speed > maxSpeed) {
      speed = maxSpeed;
      return;
    }
    speed += 2;
  }

  @override
  void brake() {
    if (speed - 2 < 0) {
      speed = 0;
      return;
    }
    this.speed -= 2;
  }
}

main() {
  // Polymorphism
  Vehicle car = new Car(180, 4);

  // Casting
  int doors = (car as Car).doors;

  // Calling abstract method
  car.accelerate();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接