我已经用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();
答案 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
关键点:
abstract
。implements
签订合同。这将迫使您在具体类上实现所有预期的行为,但它不会继承抽象类&#39;提供的方法&#39;实施extends
扩展抽象类,具体类将继承抽象类的所有可能行为。那就是它!
另外,你可能想看一下mixins,那里是我在语言导览中你的那一部分。
答案 2 :(得分:0)
您可以创建一个抽象类,由具体类扩展(或实现)。抽象类可以包含抽象方法(带有空体)。
抽象类是一种不能直接实例化的类,这意味着不能从它创建对象。
抽象类不能被实例化,但可以被子类化。
为了定义抽象类,我们使用抽象关键字。
抽象类通常有抽象方法。下面是一个声明具有抽象方法的抽象类的示例:
任何扩展 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