Dart中的抽象基类

时间:2015-11-24 21:47:51

标签: java oop dart abstract-class base-class

我已经用Java编程了近两年但我现在更多地转向Web编程,因此转向Javascript,或者我的情况转向Dart。对于我正在研究的项目,我希望有抽象基类,就像我在Java中一样。我一直在网上看,但我在Dart的抽象课上找不到任何东西。我只找到了this article from the dartlang site on mixins,在一个例子中,它使用了一个类的abstract关键字。但我真的不了解mixins原则。

有人可以将这个简单的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();

3 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:8)

我不认为有人会为你翻译整件事,但我会看看mod_expires

关键点:

  • Dart中的抽象类必须标记为abstract
  • 抽象类可以有#34;抽象方法&#34;,你只需要省略正文
  • 具体课程可以将自己标记为&#34;实施&#34;抽象类&#39;与关键字implements签订合同。这将迫使您在具体类上实现所有预期的行为,但它不会继承抽象类&#39;提供的方法&#39;实施
  • 您可以使用关键字extends扩展抽象类,具体类将继承抽象类的所有可能行为。

那就是它!

另外,你可能想看一下mixins,那里是我在语言导览中你的那一部分。

答案 2 :(得分:0)

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

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

  2. 抽象类不能被实例化,但可以被子类化。

  3. 为了定义抽象类,我们使用抽象关键字。

抽象类通常有抽象方法。下面是一个声明具有抽象方法的抽象类的示例:

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

abstract class Describable {
  void describe();

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

完整示例

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