dart基础之类接口操做符重载相关

Dart是一门面向对象语言,和java同样,全部的类都继承自Object。可是也有不少不同的地方,好比对构造函数的支持、操做符重载等新玩法,本次介绍一下dart中的新玩法。java


1.类中省略不少关键字缓存

在建立对象时能够省略new关键字,直接Class()就能够建立了。而后类中方法返回值也能够省略,省略后就是dynamic类型,在实际运行时肯定实际类型。函数


2.表示私有类方法和属性this

在java中有private关键字表明私有,可是dart中并无private关键字,而是规定如下划线_开头的类、方法、属性做为私有,对其余文件不可见。在dart中没有protected概念,只要不如下划线开头就是表明公有。code


3.构造函数语法糖cdn

在实际的开发中,常常在构造函数中给类中的变量赋值,并且写的代码都是千篇一概毫无养分。在dart中能够对该状况进行简写,不须要大括号均可以搞定。以下,咱们在A类中定义好了给x、y属性赋值的最简方式,注意,参数必定要this.开头,否则运行是会报错的,由于没实现体,只有this.开头的参数才能够不写实现,系统自动给实现成给属性赋值。而后还有一个注意点,这里面的参数必定要写全,好比写成A(this.x)也会报错的。对象


4.命名构造函数blog

构造函数重载在java中是经常使用的,好比自定义view中须要同时写3个构造函数。 Dart 并不支持构造函数的重载,而采用了命名构造函数为一个类实现多个构造函数。在dart中构造方法名能够修改成和实际业务相关,好比a功能调用A.a( )构造方法,b功能调用A.b( )构造方法。继承


5.重定向构造方法接口

能够在构造方法上使用:this来重定向,调用该构造方法之后,至关因而调用另外的构造方法。须要注意的是,在java中是在方法体中使用this()的方式,dart中是不支持的。


6.常量构造方法

若是你的类提供一个状态不变的对象,你能够把这些对象 定义为编译时常量。要实现这个功能,须要定义一个 const 构造函数, 而且声明全部类的变量为final


7.工厂构造方法

当实现一个使用'factory' 关键词修饰的构造函数时,这个构造函数没必要建立类的新实例。例如,一个工厂构造函数 可能从缓存中获取一个实例并返回,或者 返回一个子类型的实例。(工厂构造函数没法访问 'this')


利用这一特性,能够用工厂构造方法实现单例,dart中的单例和java中的相似,私有化构造方法,记录对外getInstance方法,在getInstance中建立对象而且返回。提示一下固然和java的实现方式同样,不使用这个构造方法,而是用一个static getInstance方法也是能够实现的。


8.getter和setter

这个有点意思,将某个新属性和类中其余属性创建关系,每当该属性变化时,能够直接给其余属性赋值。至关因而Java中首先定义了一个right变量,而后再变量的set中写好left=value-width,在get中写好right=left+width,可是dart中直接简写了。


9.操做符重载

dart是支持操做符重载的,能够将系统支持的操做符进行重载,赋予其另外的功能,目前dart中能够重载的操做符以下:

举个例子,能够用操做符重载让某个类的对象之间可使用加减法操做。固然只要你高兴,也可让类的对象和整数加减乘除什么的都是能够的。


10.抽象类

和java相似,dart中抽象类也是能够定义无实现的抽象方法。同时,抽象类也不能够实例化,除非定义工厂方法并返回子类,这里定义工厂方法是为了避免让构造方法返回自身,由于自身是不可初始化的,具体的代码以下:


11.接口

在java中接口是用interface关键字声明,可是dart中不须要任何声明,任一个类均可以做为接口。当须要把某个类当作接口来实现时,只须要使用implements。dart中同一个类也能够实现多个接口,和java中同样必须复写父接口中的全部方法。若是父类中的方法被子类所实现,那么父类中的方法是不会执行的。接口和继承另外一个区别是在继承中能够有选择性的复写父类中的方法,可是实现接口必须复写全部方法。


12.可调用的类

在dart中若是某类中有call方法,能够直接把类当作方法类调用,调用时执行类中的call方法。以下例,c为Closure对象,可是能够直接经过对象名的方法来调用call方法。这里因为初始化类时也须要传2个字符串,而且能够省略new关键字,就出现了如下的2组参数的状况,哈哈是否是很好玩呢?


13.混合机制mixins

mixins机制相似于多继承,可使用'with'关键字将多个类中的方法混合到一块儿,供混合类来调用,这又是一个新玩法。须要注意的是,被混合的父类中不容许有构造方法。如下为一个最简单的mixins实例,C类是由A、B混合而成,因此C的对象能够调用A中的a方法。

特性一  若是被混合的多个类中含有相同的方法,则调用最后被混淆的那个

以下图,C类是由A类和B类混淆而成,而后A类和B类中都有a( ),最后用C类对象来调用a(),最后的结果是输出B,由于在混合时B比A更后面混合,因此调用B的。


特性二  若是被混合的类中含有的方法在混合类中自己存在,则调用混合类自己的方法。

在下图中,因为混合类C中自己就定义了a( ),因此最后调用的是C中的a( )。


特性三  混合类和继承是兼容的,两者结合还有特殊的写法

在下图中,AB类继承自P,而后混合了A类和B类,其中P类、A类、B类中都有相同的getMessage方法,最后在混合后的AB类中调用getMessage方法,最终执行到的是B类中的getMessage方法,缘由是B类是最后混合的,其余2个类的都被B类中的覆盖了。须要注意的是,extends必须写在with前面,这也说明了被继承中的类中的方法只能被覆盖,不能覆盖被混合的类中的同名方法了。


混合类的使用场景:由于继承只能有一个父类,不能支持同时调用多个父类中的方法。而接口的话就必须实现全部的方法,但有时候咱们想直接使用不少父类中的方法,而不想复写时就能够用到混合类,使代码变得至关实用简洁。以下图,person1想使用swimming方法和jump方法,因此必须继承swimming而且实现jump,最坑的是须要实现jump方法,而咱们并不想修改jump的实现,虽然改完之后能够达到目的,可是未免显得繁琐,里面写了不少无用代码。再看看person2类直接with Swimming,Jump就搞定了,是否是简洁不少?


总结:本文分享了一下dart中有关类(对象)、抽象类、接口、混合、操做符重载等机制中和java不同的地方,感受dart中仍是有不少人性化的地方,代码更加的简洁,并且比较容易上手。也难怪,dart的野心是替代js的地位,有这种种考虑也是底气的一部分。固然,dart中好玩的地方远远不止如此,后面会继续给你们分享,但愿对你们有所帮助。

相关文章
相关标签/搜索