簡體   English   中英

Dart 中的抽象基類

[英]Abstract base class in Dart

我已經用 Java 編程近兩年了,但我現在更多地轉向 Web 編程,因此轉向 Javascript,或者在我的情況下轉向 Dart。 對於我正在從事的項目,我想要抽象基類,就像我在 Java 中一樣。 我一直在互聯網上尋找,但我根本找不到有關 Dart 抽象類的任何內容。 我只從 dart lang 站點上的 mixins 上找到了這篇文章,在一個示例中,該文章使用了抽象關鍵字作為一個類。 但是我真的不明白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();

我會看一下語言之旅,有一整節是關於抽象類的

關鍵點:

  • Dart 中的抽象類必須標記為abstract
  • 抽象類可以有“抽象方法”,你只需要省略主體
  • 具體類可以使用關鍵字implements將自己標記為“實現”抽象類的契約。 這將迫使您在具體類上實現所有預期行為,但它不會繼承抽象類的提供方法的實現。
  • 您可以使用關鍵字extends擴展抽象類,具體類將繼承抽象類的所有可能行為。

差不多就是這樣!

此外,您可能想看看 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();
}

您可以創建一個抽象類,由具體類擴展(或實現)。 抽象類可以包含抽象方法(帶有空體)。

  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

示例來源: 抽象類

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM