Dart 中的抽象基础 class

Abstract base class in Dart

我已经在 Java 编程了近两年,但我现在更多地转向网络编程,因此转向 Javascript,或者就我而言转向 Dart。对于我正在从事的项目,我希望有抽象基础 classes,就像我希望在 Java 中那样。我一直在网上寻找,但我根本找不到关于 Dart 的抽象 classes 的任何内容。我只发现 this article from the dart lang site on mixins,在示例中使用抽象关键字作为 class。但是mixins原理我不是很懂

有人可以将这个简单的 Java 抽象基础 class 示例翻译成 Dart 以便我可以基本了解它是如何完成的镖?该示例涵盖抽象基础class(当然,使用抽象方法),多态性铸造对象方法重载(在本例中是构造函数)、调用超级构造函数调用重载的自己的构造函数.

// 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();

我会看一下 Language tour, there's a whole section on abstract classes

要点:

  • Dart 中的摘要 classes 必须标记为 abstract.
  • 一个摘要class可以有"abstract methods",你只需要省略正文
  • 一个具体的 class 可以用关键字 implements 将自己标记为 "implementing" 抽象的 class 合约。这将迫使您在具体 class 上实现所有预期行为,但它不会继承抽象 class 提供的方法的实现。
  • 您可以使用关键字 extends 扩展抽象 class,具体 class 将继承抽象 class 的所有可能行为。

差不多就这些了!

此外,您可能想看一下 mixin,在我为您介绍的语言导览中的那个下面有一个部分。

实际上它在 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();
}

您可以创建一个抽象 class 以由具体 class 扩展(或实现)。抽象 classes 可以包含抽象方法(具有空主体)。

  1. 抽象class是class的一种类型,不能直接实例化,这意味着不能从它创建对象。

  2. 抽象 class 无法实例化,但可以被子class编辑。

  3. 要定义抽象 class 我们使用抽象关键字。

抽象 classes 通常有 抽象方法。这是声明具有抽象方法的抽象 class 的示例:

任何 class 扩展 Describable 都有 describeWithEmphasis() 方法,它调用 describe() 扩展器的实现。

abstract class Describable {
  void describe();

  void describeWithEmphasis() {
    print('=========');
    describe();
    print('=========');
  }
}
  • 抽象方法只能存在于抽象中class。
  • 要使方法抽象,请使用分号 (;) 代替方法主体。

完整示例

abstract class Person{
void walk();  //Abstract Method
  void talk();  //Abstract Method
}
class Jay extends Person{
  @override
  void walk() {
    print("Jay can walk");
  }
@override
  void talk() {
    print("Jay can talk");
  }
}
main(){
  Jay jay = new Jay();
jay.talk();
  jay.walk();
}

Output
Jay can talk
Jay can walk

示例来源:Abstract Classes