likes
comments
collection
share

Dart继承体系设计与Java异同(extend, mixins, implements, final)面向对象编程 面

作者站长头像
站长
· 阅读数 35

面向对象编程

面向对象编程是一种编程范式或者分类,将数据属性或者函数方法组织成一个单元,成为对象。面向对象编程以对象为基础,将算法和数据封装在其中,程序可以访问和修改对方关联的数据,完成业务需要的需求。面向对象编程包括封装,继承,多态。运行时多态是如何实现的呢?父类引用指向子类对象,子类重写分类的方法,引用调用重写的方法,这样就能根据运行时实际对象类型调用相应的方法了。这里的对象和类创建的对象是一个不同的概念,面向对象编程中的对象是一个广义的概念,只要是属性和方法的封装都可以理解为对象,可以对应类,接口等等。

Java的继承体系

Java所有类的父类是Object,Java是一个只支持单继承的编程语言,只能继承一个类,也就是只有一个父类,继承用关键字extends。Java支持实现多个接口,实现接口关键字用implements。抽象类使用abstract关键字修饰,抽象类中的方法至少有一个抽象方法,抽象方法同样用关键字abstract修饰,只有方法声明,没有方法体实现,抽象类不能实例化。接口中的方法可以使未实现的方法,也可以有defalut默认实现的方法(defalut方法可以不用再子类中重写)。final关键字修饰的类,不能被其他类继承;final修饰的方法,不能被子类重写;final修饰的属性变量,不能被重复赋值,只能赋值一次。abstract和final关键字不能同时修饰类,它们两个再修饰类的时候是互斥的。示例代码,如下所示:

interface Walk {
    default void walk() {
        System.out.println("Walk walk");
    }
}
interface Run {
    void run();
}
abstract class Mammal{
    abstract void birth();
}
class Human extends Mammal implements Walk, Run {

    @Override
    public void walk() {
        Walk.super.walk();
    }

    @Override
    public void run() {

    }

    @Override
    void birth() {

    }
}

Java是一个非常棒的编程语言。Java在编程方面称霸20多年,一方面是因为它的性能以及安全性。另一方面也是因为它的简洁性,尤其是在继承体系方面的设计。不夸了Java了,我们来看看Dart在这方面的表现如何。

浅析Dart继承体系

Dart所有类(除了null)的父类是Object,Dart是空安全的语言,这一点更像Kotlin。Dart同样也是一个只支持单继承的编程语言。方法的重写用 @override注解标识。Dart中所有类都隐式定义了一个接口。因此,您可以实现任何类。您可以创建一个抽象类使用abstract关键字修饰,以供具体类扩展extends(或实现implements)。抽象类可以包含抽象方法(没有方法体),抽象方法不需要abstract关键字修饰。

abstract class Describable {
  void show() {
    print("Describable show");
  }
  void describe();

  void describeWithEmphasis() {
    print('=========');
    describe();
    print('=========');
  }
}

class CustomDescribable extends Describable {
  @override
  void describe() {
    print("CustomDescribable");
  }

  @override
  void show() {
    super.show();
    print("CustomDescribable show");
  }
}

mixin

mixin是定义可以在多个类层次结构中重复使用的代码的一种方式。使用关键字mixin和with关键字达到复用逻辑的目的。Mixins和mixin类不能有extends子句,并且不能声明任何生成构造函数。

mixin Walk {
  int legs = 1;

  void walk() {
    print('Run using legs of : $legs');
  }
}

class Human with Walk {
  Human(){
    super.legs = 2;
  }
  @override
  void walk() {
    super.walk();
    print("Human legs is $legs");
  }
}

void main() {
  dynamic human = Human();
  if (human is Walk) {
      print("human is a Walk");
      human.walk();
  } else {
    print("human is not a Walk");
  }

  
}

简单分析上面的示例代码:

  1. mixin修饰名称代表是一个可复用的混合类型。
  2. 使用with限定minin复合类型。
  3. is关键字判断是否是某种类型。如果是某种类型,则进行智能转换成特定的这种类型。
implements

Dart中所有类都隐式定义了一个接口。因此,您可以实现任何类。Java定义接口直接用interface关键字,后面加上接口的名称以及接口的具体内容。Dart定义接口不太一样,要定义接口,请使用interface和class组合修饰符。接口自身定义库之外的库可以实现接口,但不能扩展(extends)它。代码示例如下:

interface class Vehicle {
  void moveForward(int meters) {
    // ...
  }
}

假如上面的接口是定义在vehicle package中,开发者依赖应用了这个package,开发者可以实例化Vehicle,可以添加implements Vehicle的子类,但是不能增加extends Vehicle的子类。

final

Java中final关键字如果修饰类,代表这个类不能被继承。Dart中的关键字final代表这个类可以在同一个库中扩展或实现。

abstract和final组合使用似乎是互斥的。看一下下面String的例子: Dart继承体系设计与Java异同(extend, mixins, implements, final)面向对象编程 面 abstract关键字:该类为字符串操作提供了定义,但依赖于Dart运行时来实现实际实例,不能调用String的构造方法来创建String的实例。 final关键字:没有子类可以改变String类的行为,从而确保一致性和性能。

总结

Java和Dart语言在继承体系上大同小异。他们都是单继承,只能有一个父类,所有类都有一个父类Object,但是可以实现多个接口。不同点是Dart可以有mixin,可以复用相应的属性和方法。Dart接口的概念和Java也是有一定的差别。希望文章对大家有所帮助,如果文章有所纰漏请不吝指教,大家共同进步。

转载自:https://juejin.cn/post/7400157847537975305
评论
请登录